定义一个二维数组:
int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, };
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
输入:
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
输出:
左上角到右下角的最短路径,格式如样例所示。
样例输入:
0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
样例输出:
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
#include<iostream>
#include<cstdio>
using namespace std;
struct maze {
int x, y, f;//该空格横纵坐标和上一个空格的队列下标
}e,w;
int q[] = { -1,0,1,0 };
int p[] = { 0,1,0,-1 };//使遍历顺时针进行
int a[5][5], b[5][5];//b数组用来记录上一步,防止退回
struct maze que[50],ans[50];
int front, rear;//队列的基本信息
void print(struct maze w)//这里的输出学到了!!!先找后输出
{
if (w.f != -1)//==-1时直接输出,就没有遗忘起点!!!
print(que[w.f]);
cout << "(" << w.x << "," << " " << w.y << ")" << endl;
}
void bfs()
{
front = rear = 0;
e.x = 0, e.y = 0, e.f = -1;
b[0][0] = 1;//遗忘了这个!!!!导致一直无答案
que[rear++] = e;//将起始位置存入队列
while (front < rear)//当队列不为空时
{
e = que[front++];//得到队首坐标(起点与终点相等时要单独考虑)
for (int i = 0; i < 4; i++) {//遍历四个方向
w.x = e.x + q[i];
w.y= e.y + p[i];
w.f = front - 1;//上一个状态
if(w.x == 4 && w.y == 4) {//到达终点,写到循环里面,保证单层就可以退出
/*int i = 0;
//cout << "123";
while (w.f!=-1) {
ans[i] = w;//这里开始打成了e,调试了好久
w = que[w.f];
i++;
}
cout <<"(0, 0)" << endl;//逗号后面有空格,周赛用深搜做的时候就在这里错了
for (i--; i >= 0; i--)
cout << "(" << ans[i].x << "," <<" " << ans[i].y << ")" << endl;*/
if (w.f != -1)
print(w);
return;
}
if (w.x >= 0 && w.x < 5 && w.y >= 0 && w.y< 5 && !a[w.x][w.y] && !b[w.x][w.y]) {
que[rear++] = w;//进队
b[w.x][w.y] = 1;
}
}
}
}
int main()
{
for (int i = 0; i < 5; i++) {//输入迷宫
for (int j = 0; j < 5; j++) {
cin >> a[i][j];
}
}
bfs();
return 0;
}