时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:1497

解决:406

题目描述:

有一个6*6的棋盘,每个棋盘上都有一个数值,现在又一个起始位置和终止位置,请找出一个从起始位置到终止位置代价最小的路径:

    1、只能沿上下左右四个方向移动

    2、总代价是没走一步的代价之和

    3、每步(从a,b到c,d)的代价是c,d上的值与其在a,b上的状态的乘积

    4、初始状态为1

每走一步,状态按如下公式变化:(走这步的代价%4)+1。

输入:

第一行有一个正整数n,表示有n组数据。

    每组数据一开始为6*6的矩阵,矩阵的值为大于等于1小于等于10的值,然后四个整数表示起始坐标和终止坐标。

输出:

输出最小代价。

样例输入:
1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
0 0 5 5
样例输出:
23
来源:
2005年上海交通大学计算机研究生机试真题

思路:

本题我开始不会做,参考了别人的博客做出来的。

此题比较好的办法是用BFS,求的过程中要适当剪枝。

DFS也可求解。

参考的博客地址:

http://blog.csdn.net/gladyoucame/article/details/8803904

里面分别用C++实现了BFS和DFS。

我的C代码:

#include <stdio.h>
#include <stdlib.h>
 
#define INF (1e9)
#define M (6*6*4+1)
 
typedef struct node {
    int x, y;
    int sum;
    int state;
} Point;
 
int cost[6][6][4];
int value[6][6];
Point begin, end;
int dir[4][2] = {{0, 1},{1, 0},{0, -1},{-1, 0}};
Point *queue[M];
int front, rear;
 
void initQueue()
{
    front = rear = 0;
}
 
int isEmpty()
{
    return front == rear;
}
 
void push(Point *a)
{
    queue[rear] = a;
    rear = (rear+1)%M;
}
 
Point *top()
{
    return queue[front];
}
 
void pop()
{
    front = (front+1)%M;
}
 
void BFS()
{
    int i;
    push(&begin);
    while (!isEmpty())
    {
        Point *p = top();
        pop();
        for (i=0; i<4; i++)
        {
            int tx = p->x + dir[i][0];
            int ty = p->y + dir[i][1];
            if (tx>=0 && tx<6 && ty>=0 && ty<6)
            {
                int tcost = p->state * value[tx][ty];
                int costNow = p->sum + tcost;
                if (costNow < cost[tx][ty][tcost%4]
                    && costNow < cost[end.x][end.y][tcost%4])
                {
                    cost[tx][ty][tcost%4] = costNow;
                    Point *p1 = (Point *)malloc(sizeof(Point));
                    p1->x = tx;
                    p1->y = ty;
                    p1->sum = costNow;
                    p1->state = tcost%4 + 1;
                    push(p1);
                }
            }
        }
        if (p != &begin)
            free(p);
    }
}
 
int Min(int a, int b)
{
    return (a<b) ? a : b;
}
     
int main(void)
{
    int n, i, j, k;
 
    scanf("%d", &n);
    while (n--)
    {
        for (i=0; i<6; i++)
        {
            for (j=0; j<6; j++)
            {
                scanf("%d", &value[i][j]);
                for (k=0; k<4; k++)
                    cost[i][j][k] = INF;
            }
        }  
                 
        scanf("%d%d", &begin.x, &begin.y);
        scanf("%d%d", &end.x, &end.y);
        begin.sum = 0;
        begin.state = 1;
        initQueue();
        BFS();     
                     
        int min = INF;
        for(i=0; i<4; i++)
            min = Min(cost[end.x][end.y][i], min);
        printf("%d\n", min);
    }          
             
    return 0;
}
/**************************************************************
    Problem: 1091
    User: liangrx06
    Language: C
    Result: Accepted
    Time:0 ms
    Memory:916 kb
****************************************************************/

九度OJ 1091:棋盘游戏 (DP、BFS、DFS、剪枝)的更多相关文章

  1. 九度OJ 1120:全排列 (DFS)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4471 解决:1139 题目描述: 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列. 我们假设对于小写字母有'a' < ...

  2. 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)

    题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...

  3. 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...

  4. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  5. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  6. 【九度OJ】题目1475:IP数据包解析 解题报告

    [九度OJ]题目1475:IP数据包解析 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1475 题目描述: 我们都学习过计算机网络, ...

  7. 【九度OJ】题目1205:N阶楼梯上楼问题 解题报告

    [九度OJ]题目1205:N阶楼梯上楼问题 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1205 题目描述: N阶楼梯上楼问题:一次 ...

  8. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  9. 九度OJ 1502 最大值最小化(JAVA)

    题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...

随机推荐

  1. 标准C程序设计七---107

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  2. 标准C程序设计七---71

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  3. 十六进制字符串jpg图片互转

    十六制字符串jpg图片互转(格式:FFD8FFE000104A******)如:FFD8FFE000104A46494600010100000100010000FFDB0043000806060706 ...

  4. python常用模块2

    collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict. ...

  5. 【UTR #2】题目交流通道

    题目描述 定好了难度,雄心勃勃的吉米多出题斯基开始寻找智慧的神犇星球的居民出题. 然而吉米多出题斯基没有料到,神犇星球的居民告诉吉米多出题斯基:"今年神犇星球经济不景气,大家都想宅在家里,哪 ...

  6. Redis集群设计原理

    ---恢复内容开始--- Redis集群设计包括2部分:哈希Slot和节点主从,本篇博文通过3张图来搞明白Redis的集群设计. 节点主从: 主从设计不算什么新鲜玩意,在数据库中我们也经常用主从来做读 ...

  7. 321. Create Maximum Number

    /* * 321. Create Maximum Number * 2016-7-6 by Mingyang */ public int[] maxNumber(int[] nums1, int[] ...

  8. hadoop之hdfs------------------FileSystem及其源码分析

    FileSystem及其源码分析 FileSystem这个抽象类提供了丰富的方法用于对文件系统的操作,包括上传.下载.删除.创建等.这里多说的文件系统通常指的是HDFS(DistributedFile ...

  9. 借助树莓派模拟Wimonitor并实现WiFi窃听和嗅探

    Wimonitor是一款非常优秀的黑客工具,它不仅可以帮渗透测试人员省去配置虚拟机和无线网卡等一系列麻烦事,而且它的Web接口配置起来也非常的方便.实际上,它就是一款TP-Link-MR3020路由器 ...

  10. U-net图像分割

    [Keras]基于SegNet和U-Net的遥感图像语义分割 2014 年,加州大学伯克利分校的 Long 等人提出全卷积网络(FCN),这使得卷积神经网络无需全连接层即可进行密集的像素预测,CNN ...