定义一个二维数组:
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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
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
Sample Output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
思路:利用bfs的步数为下标记录路径坐标,将记录坐标的数组放入结构体中,每次记录一个坐标,并让下一步的结构体继承上一步的坐标,则当走到终点时,到终点的结构体所记录的路径即为最短路径,下标为步数,从头到尾输出
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int M=110;
int mp[M][M];
int book[M][M];
int nx[4][2]={0,1,1,0,0,-1,-1,0};
struct node
{
int x;
int y;
///用步数当坐标的下标
int step;
///记录每次走过的坐标
int a[M];
int b[M];
}qq[M];
int main()
{
int i,j,k,l,m,n,s=0;
node u,v,w;
queue<node>q;
memset(book,0,sizeof(book));
for(i=0;i<5;i++)
for(j=0;j<5;j++)
cin>>mp[i][j];
///初始化
u.x=0;u.y=0;u.step=0;
///起点坐标
u.a[0]=0;
u.b[0]=0;
book[u.x][u.y]=1;
q.push(u);
while(!q.empty())
{
v=q.front();
q.pop();
if(v.x==4&&v.y==4)///找到终点
{
///将到终点的这个结构体所存的路径输出
for(i=0;i<=v.step;i++)
cout<<"("<<v.a[i]<<", "<<v.b[i]<<")"<<endl;
break;
}
///继承这个结构体前面走过的坐标
///实质上就是记录上一步的坐标
///(到最后就把整个路径的坐标记录了下来)
w=v;
for(i=0;i<4;i++)
{
w.x=v.x+nx[i][0];
w.y=v.y+nx[i][1];
if(w.x>=0&&w.x<5&&w.y>=0&&w.y<5&&book[w.x][w.y]==0&&mp[w.x][w.y]!=1)
{
book[w.x][w.y]=1;
w.step=v.step+1;
///步数加1的同时记录坐标
w.a[w.step]=w.x;
w.b[w.step]=w.y;
q.push(w);
}
}
}
return 0;
}
版权声明:本文为mashizuren原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。