广度优先搜索
使用队列,反复取出队首元素,将该顶点可达到的未曾加入过队列的顶点全部入队,直到队列为空时遍历结束。
POJ - 3984 迷宫问题
需要用到广度优先搜索
先写头文件
#include<stdio.h>
#include<cstring>
#include<queue>
using namespace std;
在定义变量,结构体
其中结构体包括的内容有坐标、步数还有结构体变量
int map[6][6];
int vis[6][6];
int len,i,j;
int dir[4][2]{{0,1},{0,-1},{1,0},{-1,0}};
int x1;
int y1;
struct node{
int x;
int y;
int step;
int num[50];
};
node ans;
接着就是要写函数了,这次定义的函数有点不同,它是一个能返回结构体的函数,类型名是刚刚定义的结构体的
名字
node bfs()
{
memset(vis,0,sizeof(vis));
queue<node>q;
node a,b;
a.x=0;
a.y=0;
a.step=0;
vis[0][0]=1;
q.push(a);
while(!q.empty())
{
a=q.front();
q.pop();
if(a.x==4&&a.y==4)
{
// len=a.step;
//prinf(a);
return a;
}
for(i=0;i<4;i++)
{
b=a;
b.x=a.x+dis[i][0];
b.y=a.y+dis[i][1];
if(vis[b.x][b.y]||a1[b.x][b.y]==1)
continue;
if(b.x>=0&&b.x<5&&b.y>=0&&b.y<5)
{
vis[b.x][b.y]=1;
b.step=a.step+1;
//printf(" %d ",b.step);
b.num[a.step]=i;
//printf("%d\n",b.num[a.step]);
q.push(b);
}
}
//printf("\n");
}
return a;
}
字符数组vis[]表示的是是否走过,通过memset()将vis[]的元素全部设为0;对结构体a进行初始化,因为从(0,0)开始出发,所以出发点已经访问过了;将结构体a入队,while循环,如果队列不为空,说明还没有走到终点,让a出队,如果走到右下角了,就返回a;b结构体的作用是储存a走下一步的结果坐标;如果已经走过或是遇到墙了,就跳过此操作;若没超过边界,就将b的坐标标记为已经访问过,b继承a的步数并加一,数组存上对应的数,这个数表示如何走;返回的a的数组中就包含了该怎么走的信息
prinf()将这些信息转化为坐标输出
void prinf(node w)
{
for(i=0;i<=w.step;i++)
{
printf("(%d, %d)\n",x1,y1);
if(i!=w.step)
{
x1+=dis[w.num[i]][0];
y1+=dis[w.num[i]][1];
}
}
}