最少步数
时间限制: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,10表示道路,1表示墙。
现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?
(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)
- 输入
- 第一行输入一个整数n(0
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。 - 输出
- 输出最少走几步。
- 样例输入
2 3 1 5 7 3 1 6 7
- 样例输出
12 11
02.#include 03.#define min(x,y) x>y?y:x 04.int maze[9][9]={1,1,1,1,1,1,1,1,1, 05. 1,0,0,1,0,0,1,0,1, 06. 1,0,0,1,1,0,0,0,1, 07. 1,0,1,0,1,1,0,1,1, 08. 1,0,0,0,0,1,0,0,1, 09. 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.int a,b,c,d,m; 14.void dfs(int x,int y,int s){ 15. if(maze[x][y]) return; 16. if(x==c&&y==d){ 17. m=min(s,m);(找出最短的步数) 18. return; 19. } 20. s++; 21. maze[x][y]=1; (对可以走的路径进行标记) 22. dfs(x+1,y,s); 23. dfs(x,y+1,s); 24. dfs(x-1,y,s); 25. dfs(x,y-1,s); 26. maze[x][y]=0; (每搜索一次后恢复原状) 27.} 28. 29.int main(){ 30. int n; 31. scanf("%d",&n); 32. while(n--){ 33. m=9999; 34. scanf("%d%d%d%d",&a,&b,&c,&d); 35. dfs(a,b,0); 36. printf("%d\n",m); 37. } 38. return 0; 39.}