最少步数
时间限制:
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
最简单的bfs。。
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
int const mp[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 };
struct node{
int x, y;
int step;
}u;
int const mx[4] = {0, 0, 1, -1};
int const my[4] = {1, -1, 0, 0};
int main()
{
int N;
cin >> N;
while(N--){
int vis[9][9];
memset(vis, 0, sizeof(vis));
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
queue<node> q;
u.x = x1, u.y = y1, u.step = 0;
vis[x1][y1] = 1;
q.push(u);
while(!q.empty()){
u = q.front();
if(u.x == x2 && u.y == y2){
cout << u.step << endl;
break;
}
q.pop();
for(int i = 0 ; i < 4; i++){
int x = u.x + mx[i];
int y = u.y + my[i];
int s = u.step;
if(!vis[x][y] && !mp[x][y]){
node v;
v.x = x, v.y = y, v.step = s + 1;
vis[x][y] = 1;
q.push(v);
}
}
}
}
return 0;
}