题目:A-Maze
题目描述:东东有一张地图,想通过地图找到妹纸。地图显示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹纸,这两个位置保证为0。既然已经知道了地图,那么东东找到妹纸就不难了,请你编一个程序,写出东东找到妹纸的最短路线。
输入:输入是一个5 × 5的二维数组,仅由0、1两数字组成,表示法阵地图。
输出:输出若干行,表示从左上角到右下角的最短路径依次经过的坐标,格式如样例所示。数据保证有唯一解。
注意:
坐标(x, y)表示第x行第y列,行、列的编号从0开始,且以左上角为原点。
另外注意,输出中分隔坐标的逗号后面应当有一个空格。
解题思路:典型的迷宫类题目,这里可以利用广度优先搜索加上记忆化解决(当然dfs也可以)。可以通过设置一个结构体,里面记录了该位置的上个位置,最后搜到目标之后,可以回溯返回路线。
代码:
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
struct node//要构建的结构体
{
int x;
int y;
int pre;
int now;
};
int d1[4]={0,1,-1,0},d2[4]={1,0,0,-1};
int a[5][5];
node h[25];
int main()
{
int t;
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
cin>>a[i][j];
}
}
h[0].x=0,h[0].y=0,h[0].pre=-1,h[0].now=0;
queue<node> q;
q.push(h[0]);//广搜开始
int k=1;
while(!q.empty())
{
node m=q.front();
q.pop();
int x=m.x,y=m.y,x1,y1,Now=m.now;
if(x==4&&y==4)
{
t=Now;
break;
}
for(int i=0;i<4;i++)
{
x1=x+d1[i],y1=y+d2[i];
if(x1<0||y1<0||x1>4||y1>4)
{
continue;
}else if(a[x1][y1]==1)
{
continue;
}
a[x1][y1]=1;
h[k].x=x1,h[k].y=y1,h[k].now=k,h[k].pre=Now;//记录
q.push(h[k]);
k++;
}
}
vector<node> f;//保存到vector中
while(t!=-1)
{
f.push_back(h[t]);
t=h[t].pre;
}
for(int i=f.size()-1;i>=0;i--)
{
cout<<"("<<f[i].x<<", "<<f[i].y<<")"<<endl;//输出
}
}