题目网址:http://acm.nyist.net/JudgeOnline/problem.php?pid=58
打码过程中仔细点就可以了。另外42行代码加在了最后(一轮操作执行完),
而不是每一次函数返回都执行。
描述
这有一个迷宫,有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 #include <stdio.h> 2 #include <memory.h> 3 int flag[10][10]; 4 int cnt[10][10]; 5 int a[10][10]={ 6 {1,1,1,1,1,1,1,1,1}, 7 {1,0,0,1,0,0,1,0,1}, 8 {1,0,0,1,1,0,0,0,1}, 9 {1,0,1,0,1,1,0,1,1}, 10 {1,0,0,0,0,1,0,0,1}, 11 {1,1,0,1,0,1,0,0,1}, 12 {1,1,0,1,0,1,0,0,1}, 13 {1,1,0,1,0,0,0,0,1}, 14 {1,1,1,1,1,1,1,1,1} 15 }; 16 int a0,b,c,d; 17 18 void init_cnt(){ 19 for (int i = 0; i < 9; i++) 20 for (int j = 0; j < 9; j++) 21 cnt[i][j] = 11000; 22 } 23 void dfs(int cur_x,int cur_y,int count){ 24 if(cur_x == c && cur_y == d){ 25 if(cnt[c][d] > count) 26 cnt[c][d] = count; 27 return ; 28 } 29 if(flag[cur_x][cur_y] || a[cur_x][cur_y]) 30 return ; 31 flag[cur_x][cur_y] = 1; 32 if(cnt[cur_x][cur_y] > count) 33 cnt[cur_x][cur_y] = count; 34 /// 上 35 dfs(cur_x - 1, cur_y, count + 1); 36 /// 下 37 dfs(cur_x + 1, cur_y, count + 1); 38 /// 左 39 dfs(cur_x, cur_y - 1, count + 1); 40 /// 右 41 dfs(cur_x, cur_y + 1, count + 1); 42 flag[cur_x][cur_y] = 0; 43 } 44 45 int main(void){ 46 int n; 47 scanf("%d",&n); 48 while(n--){ 49 scanf("%d%d%d%d",&a0,&b,&c,&d); 50 for(int i = 0; i < 10; i++) 51 memset(flag[i],0,9 * sizeof(int)); 52 init_cnt(); 53 dfs(a0,b,0); 54 printf("%d ",cnt[c][d]); 55 } 56 return 0; 57 }