最少步数----深搜

最少步数

时间限制: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(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。
输出
输出最少走几步。
样例输入
2
3 1  5 7
3 1  6 7
样例输出
12
11

1
2 #include <stdio.h> 3 int tu[9][9]={ 4 1,1,1,1,1,1,1,1,1, 5 1,0,0,1,0,0,1,0,1, 6 1,0,0,1,1,0,0,0,1, 7 1,0,1,0,1,1,0,1,1, 8 1,0,0,0,0,1,0,0,1, 9 1,1,0,1,0,1,0,0,1, 10 1,1,0,1,0,1,0,0,1, 11 1,1,0,1,0,0,0,0,1, 12 1,1,1,1,1,1,1,1,1, 13 }; 14 int bs[9][9]={0}; 15 int min=32; 16 17 int DFS(int a,int b,int c,int d,int count)/*起始位置(a,b),终点位置(c,d),步数count 初值为 0 */ 18 { 19 if(tu[a][b]==1) return count; 20 else 21 { 22 if(a==c&&b==d) 23 { 24 if(min>count) min=count; 25 } 26 bs[a][b]=1; 27 28 if((!tu[a-1][b])&&(!bs[a-1][b]))/*上边*/ 29 count=DFS(a-1,b,c,d,count+1); 30 if((!tu[a+1][b])&&(!bs[a+1][b]))/*下边*/ 31 count=DFS(a+1,b,c,d,count+1); 32 if((!tu[a][b-1])&&(!bs[a][b-1]))/*左边*/ 33 count=DFS(a,b-1,c,d,count+1); 34 if((!tu[a][b+1])&&(!bs[a][b+1]))/*右边*/ 35 count=DFS(a,b+1,c,d,count+1); 36 37 bs[a][b]=0; 38 39 return count-1; 40 } 41 } 42 43 int main(void) 44 { 45 int a,b,c,d,n,count; 46 scanf("%d",&n); 47 while(n--) 48 { 49 count=0; 50 min=30; 51 scanf("%d%d%d%d",&a,&b,&c,&d); 52 if(tu[a][b]==0 && tu[c][d]==0) 53 { 54 DFS(a,b,c,d,count); 55 printf("%d ",min); 56 } 57 } 58 return 0; 59 } 60
原文地址:https://www.cnblogs.com/xiaoyunoo/p/3516875.html