迷宫之广搜算法
题目描述
核心思路
难点在于如何记录路径:
- 我们用Pre[]数组来记录某个点是从哪个点走过来的,比如 P r e [ i ] = j Pre[i]=j Pre[i]=j,表示i节点是从j节点走过来的,换句话说,就是i的前驱是j。
- 我们用 P a t h [ 81 ] [ 2 ] Path[81][2] Path[81][2]来记录路径,第二维中的 [ 0 ] [0] [0]表示横坐标, [ 1 ] [1] [1]表示纵坐标。
当我们要输出路径时:
- 根据Pre数组,从终点出发,一直找到前驱点,最终递归到起点,那么就可以知道从终点到起点的路径信息,然后回溯时输出从起点到终点的路径信息。
输出路径如下图:
代码
#include<iostream>
using namespace std;
char Map0[9][9]={{".#..."},
{".#.#."},
{"....."},
{".#.#."}
};
char Map[9][9];
int m=4,n=4; //m是行数 n是列数
int SouX=3,SouY=1;
int DesX=m,DesY=n;
int Pre[81];
int Path[81][2];
int head,tail;
bool flag,Visited[9][9];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
void ChangeMap()
{
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
Map[i][j]=Map0[i-1][j-1];
}
void Print(int i)
{
if(Pre[i]!=0)
Print(Pre[i]);
printf("%d,%d ",Path[i][0],Path[i][1]);
}
void BFS()
{
head=0,tail=1;
Path[tail][0]=SouX;
Path[tail][1]=SouY;
Pre[tail]=head;
Visited[SouX][SouY]=true;
printf("%d,%d head=%2d tail=%2d\n",SouX,SouY,head,tail);
while(head!=tail)
{
head++;
for(int i=0;i,4;i++)
{
int x=Path[head][0]+dx[i];
int y=Path[head][1]+dy[i];
if(Map[x][y]=='.'&&!Visited[x][y])
{
tail++;
Path[tail][0]=x;
Path[tail][1]=y;
Pre[tail]=head;
Visited[x][y]=true;
printf("%d,%d head=%2d tail=%2d\n",SouX,SouY,head,tail);
if(x==DesX&&y==DesY)
{
flag=true;
Print(tail);
break;
}
}
}
if(flag)
break;
}
}
int main()
{
ChangeMap();
DFS(SouX,SouY,step);
return 0;
}