最少步数
时间限制:
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<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。
输出
- 输出最少走几步。 样例输入
-
2 3 1 5 7 3 1 6 7
样例输出
-
12 11
-
第一行输入一个整数n(0<n<=100),表示有n组测试数据;
代码:
#include<stdio.h>
#include<string.h>
#define min(a,b) a<b?a:b
int map_1[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},
mov[4][2]={1,0,0,-1,-1,0,0,1};
int x2,y2,minn;
void dfs(int step,int x,int y){
if(step>minn)return;
if(x==x2&&y==y2){
minn=min(step,minn);
return;
}
for(int i=0;i<4;i++){
if(map_1[x+mov[i][0]][y+mov[i][1]]==0){
// printf("%d %d\n",x,y);
map_1[x+mov[i][0]][y+mov[i][1]]=1;
dfs(step+1,x+mov[i][0],y+mov[i][1]);
map_1[x+mov[i][0]][y+mov[i][1]]=0;
}
}
}
int main(){
int N,x1,y1;
scanf("%d",&N);
while(N--){
minn=0x3f3f3f3f;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
dfs(0,x1,y1);
printf("%d\n",minn);
}
return 0;
}