NYOJ58-最少步数

简介:
最少步数
时间限制:3000 ms    内存限制:65535 KB
难度:4
描述
这有一个迷宫,有0~8行和0~8列:


 1,1,1,1,1,1,1,1,1
 1,0,0,1,0,0,1,0,1
 1,0,0,1,1,0,0,0,1
 1,0,1,0,1,1,0,1,1
 1,0,0,0,0,1,0,0,1
 1,1,0,1,0,1,0,0,1
 1,1,0,1,0,1,0,0,1
 1,1,0,1,0,0,0,0,1
 1,1,1,1,1,1,1,1,1


0表示道路,1表示墙。


现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?


(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)


输入
第一行输入一个整数n(0n=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0=a,b,c,d=8)分别表示起点的行、列,终点的行、列。


输出
输出最少走几步。

样例输入
2
3 1  5 7
3 1  6 7

样例输出
12
11


思路:DFS

AC代码:

#include<stdio.h>
#include<string.h>
int a[9][9]={
 {1,1,1,1,1,1,1,1,1},
 {1,0,0,1,0,0,1,0,1},
 {1,0,0,1,1,0,0,0,1},
 {1,0,1,0,1,1,0,1,1},
 {1,0,0,0,0,1,0,0,1},
 {1,1,0,1,0,1,0,0,1},
 {1,1,0,1,0,1,0,0,1},
 {1,1,0,1,0,0,0,0,1},
 {1,1,1,1,1,1,1,1,1}};
int b[9][9];//标记是否走过 
int min;
void Found(int x,int y,int endx,int endy,int sum)
{
   if(sum>=64)//防止栈溢出 
   return;
   
   if(x==endx&&y==endy)
   {
      if(sum<min)
      min=sum;
      return;
   }


   if(x+1<9&&a[x+1][y]==0&&b[x+1][y]==0)
   {
      b[x+1][y]=1;
      Found(x+1,y,endx,endy,sum+1);
      b[x+1][y]=0;
   }  
   
   if(x-1>=0&&a[x-1][y]==0&&b[x-1][y]==0)
   {
      b[x-1][y]=1;
      Found(x-1,y,endx,endy,sum+1);
      b[x-1][y]=0;
   }
   
   if(y+1<9&&a[x][y+1]==0&&b[x][y+1]==0)
   {
      b[x][y+1]=1;                                  
      Found(x,y+1,endx,endy,sum+1);
      b[x][y+1]=0;
   }
   
   if(y-1>=0&&a[x][y-1]==0&&b[x][y-1]==0)
   {
      b[x][y-1]=1;
      Found(x,y-1,endx,endy,sum+1);
      b[x][y-1]=0;
   }
}
int main()
{
    int i,j,n,m,x1,y1,x2,y2;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
        min=99999999;
        memset(b,0,sizeof(b));
        Found(x1,y1,x2,y2,0);
        printf("%d\n",min);
    }
    return 0;
}



相关文章
|
10月前
1330:【例8.3】最少步数 2021-01-05
1330:【例8.3】最少步数 2021-01-05
NYOJ 205
  求余数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在给你一个自然数n,它的位数小于等于一百万,现在你要做的就是求出这个数除10003之后的余数   输入 第一行有一个整数m(1T; 13 scanf("%*c")...
666 0
NYOJ 506
  洗澡 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述 Mostrp是个爱干净的好少年。 有一次去澡堂洗澡时发现 澡堂的澡柜编号中没有出现过数字‘4’。
795 0
NYOJ 123(插线问点)
  士兵杀敌(四) 时间限制:2000 ms | 内存限制:65535 KB 难度:5   描述 南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战(编号相近的人经常在一块,相互之间比较熟悉),最终他们获得的军功,也将会平分到每个人身上,这样,有时候,计算他们中的哪一个人到底有多少军功就是一个比较困难的事情,军师小工的任务就是在南将军询问他某个人的军功的时候,快速的报出此人的军功,请你编写一个程序来帮助小工吧。
807 0
|
人工智能 BI
NYOJ 45
1 // 结果超过了long long,到32就超了 2 #include 3 #include 4 using namespace std; 5 long long fun(int a,int b) 6 { 7 //if(0==b) 8 ...
581 0
NYOJ 212
  K尾相等数 时间限制:3000 ms  |  内存限制:65535 KB 难度:1   描述 输入一个自然数K(K>1),如果存在自然数M和N(M>N),使得K^M和K^N均大于等于1000,且他们的末尾三位数相等,则称M和N是一对“K尾相等数”。
608 0
|
人工智能
NYOJ 451(组合数+全错位)
  光棍节的快乐 时间限制:1000 ms | 内存限制:65535 KB 难度:2   描述 光棍们,今天是光棍节。聪明的NS想到了一个活动来丰富这个光棍节。 规则如下: 每个光棍在一个纸条上写一个自己心仪女生的名字,然后把这些纸条装进一个盒子里,这些光 棍依次抽取一张纸条,如果上面的名字就是自己心仪的女生,那么主持人就在现场给该女生打电话,告诉这个光棍对她的爱慕之情,并让光棍当场表白,并得到现场所有人的祝福,没抽到的,嘿嘿就可以幸免了。
763 0
NYOJ 219
  An problem about date 时间限制:2000 ms | 内存限制:65535 KB 难度:2   描述 acm的iphxer经常忘记某天是星期几,但是他记那天的具体日期,他希望你能写个程序帮帮他。
728 0
NYOJ 24(素数距离)
  素数距离问题 时间限制:3000 ms | 内存限制:65535 KB 难度:2   描述 现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。
783 0
|
人工智能
NYOJ 62
  笨小熊 时间限制:2000 ms | 内存限制:65535 KB 难度:2   描述 笨小熊的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小熊就认为这是个Lucky Word,这样的单词很可能就是正确的答案。
747 0