直接从给出的起点开始用QUEUE进行BFS就行,因为图式给出的固定的,所以难度不是太大。
描述
这有一个迷宫,有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
下面是代码:
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
struct node
{
int i, j, step;
};
int maps[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}
};
int toward[4][2] = {{-1,0}, {1, 0}, {0,1}, {0,-1}};
bool vis[9][9];
int step;
int start_x, start_y;
int end_x, end_y;
int BFS();
int main()
{
int T;
scanf("%d", &T);
for (int i = 0; i < T; ++i)
{
memset(vis, false, sizeof(vis));
scanf("%d%d", &start_x, &start_y);
scanf("%d%d", &end_x, &end_y);
printf("%d\n", BFS());
}
return 0;
}
int BFS()
{
queue<node> Q;
node cur, tmp;
cur.i = start_x;
cur.j = start_y;
cur.step = 0;
Q.push(cur);
while (!Q.empty())
{
cur = Q.front();
Q.pop();
if (cur.i == end_x && cur.j == end_y)
return cur.step;
for (int i = 0; i < 4; ++i)
{
tmp.i = cur.i + toward[i][0];
tmp.j = cur.j + toward[i][1];
tmp.step = cur.step + 1;
if (tmp.i >= 0 && tmp.i <= 8 && tmp.j >= 0 && tmp.j <= 8 && vis[tmp.i][tmp.j] == false && maps[tmp.i][tmp.j] == 0)
{
Q.push(tmp);
vis[tmp.i][tmp.j] = true;
}
}
}
return -1;
}