POJ 迷宫问题
关于一个萌新对于宽度搜索的探寻
代码如下
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
struct Player
{
int x;
int y;
int lailu;
}; //定义一个走迷宫的人
Player player[30]; //5x5的地图最多25步
int islailu[5][5]={0}; //标记地图,判断路是否来过的数组
int maps[5][5];
int weiyi[4][2]={{1,0},{0,-1},{-1,0},{0,1}}; //位移结构,可以向不同方向移动
void Print(Player *a) //输出函数,说实话我觉得蛮蠢的,也许可以用递归
{
int x;
x = a->lailu;
Player dao[30];
int i = 0;
int j;
while(1)
{
dao[i].x = player[x].x;
dao[i].y = player[x].y;
i++;
x = player[x].lailu;
if(x==0)break;
}
cout<<"(0, 0)"<<endl;
for(j=i-1;j>=0;j--)
{
cout<<"("<<dao[j].x<<", "<<dao[j].y<<")"<<endl;
}
cout<<"(4, 4)"<<endl;
}
int main()
{
int start,tail;
int i,j,k;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
cin>>maps[i][j]; //输入地图
start = 0;
tail = 0;
player[tail].x=0;
player[tail].y=0;
tail++;
int x,y;
while(start<tail)
{
for(k=0;k<=3;k++)
{
x=player[start].x+weiyi[k][0];
y=player[start].y+weiyi[k][1];
if(x<=4&&x>=0&&y<=4&&y>=0) //边界判定
{
if(islailu[x][y]==0&&maps[x][y]==0) //墙和已经经过的路判定
{
player[tail].x = x;
player[tail].y = y;
player[tail].lailu = start;
tail++;
}
}
if(x==4&&y==4)
{
Print(&player[tail-1]);
break;
}
}
islailu[player[start].x][player[start].y]=1; //注意已经经过的路要记得标记
start++; //位移结束后,标记然后开始下一步。
}
}
具体运行思路
利用深度优先搜索,遍历地图入队,然后在队列中每条路中标明来时的路径(在输出的时候能回头找到回去的路),通过结构体定义(来路)完成。
通用的比如求通过迷宫的步数,可以定义步数,第一个到达终点的步数必定是最短的,直接输出终点步数即可完成。
注意实现入队(数组)以及进行下一次运算的代码实现以及标记。