A-Maze/B-Pour Water
A-Maze
题目描述
根据输入地图,找到从入口(左上角)到出口(右下角)的最短路线,输出路径。地图以0 1序列给出,0代表可通行,1代表有障碍,出入口均保证为0,保证数据有唯一解。
Input
仅由0 1构成的5x5二维数组
Output
以(x, y)坐标形式,输出路径的每个点,每个点占一行,逗号后有一空格
解题思路
- 用结构体来标识每个具体的位置,用bool数组来标记每个位置是否达到的状态;
- 因为要输出具体路径,因此使用last[][]数组来记录每个位置的上一个位置(如:last[x][y]=p,表示(x,y)这个位置的上一个位置是p,p是一个位置结构体);
- 利用dx和dy来实现位置移动,每次对移动后的位置进行条件判定,符合约束边界的位置入队,并将对应位置的vis置为1标识该位置已经走过;
- 在到达出口时停止搜索,利用last数组,递归输出路径。
实现代码
#include<iostream>
#include<queue>
using namespace std;
int m[5][5]; //地图数组
bool vis[5][5]; //记录每个点是否经过
int dx[4]={
1,-1,0,0};
int dy[4]={
0,0,1,-1}; //移动数组
struct position
{
//位置结构体,xy分别为对应坐标
int x,y;
};
position last[5][5]; //记录路径中每个位置的上一个位置
queue<position> q;
void output(position p)
{
//递归形式输出路径
if(p.x==0&&p.y==0)
cout<<"(0, 0)"<<endl;
else
{
output(last[p.x][p.y]);
cout<<"("<<p.x<<", "<<p.y<<")"<<endl;
}
}
void bfs()
{
//从(0,0)开始,入队,标记vis,展开bfs
position start;
start.x=0;
start.y=0;
q.push(start);
vis[0][0]=1;
while(!q.empty())
{
position now=q.front();
q.pop();
if(now.x==4&&now.y==4)
{
//到达出口,跳出,输出路径
output(now);
break;
}
for(int i=0;i<4;++i)
{
//四邻域移动
int X=now.x+dx[