bfs模板

来源:互联网 发布:网络司法拍卖变卖 编辑:程序博客网 时间:2024/06/04 19:53

/*

bfs:(从起始点开始搜索,提前添加进队列中)

while->队列不为空

从队列头导入点

for->行走的各种方式

满足判断(没越界、没走过等等)->添加进队列中->利用其他数组设定这个点的父点,表示这个点是由父点搜索来的

直到找到终点结束

*/

/*

当找到终点时,可以从终点开始,利用父点记录往上找到路径,保存在栈里,最后输出栈就是路径了

*/

#include<iostream>

#include<stack>
#include<queue>
using namespace std;
struct point
{
int x,y;
};
int map[5][5];
stack<point>S;
point father[5][5];
int state[5][5];
int dis[4][2]={0,1,0,-1,1,0,-1,0};
bool InMap(point m)
{
if(m.x>=0&&m.x<5&&m.y>=0&&m.y<5) return true;
else return false;
}
void IsOk(point m)
{
S.push(m);
if(m.x!=0||m.y!=0)
{
point M;
M.x=father[m.x][m.y].x;
M.y=father[m.x][m.y].y;
IsOk(M);
}
}
void bfs()
{
queue<point>Q;
point m;
int i;
m.x=0;
m.y=0;
state[0][0]=1;
Q.push(m);
while(!Q.empty())
{
m=Q.front();
Q.pop();
for(i=0;i<4;i++)
{
m.x+=dis[i][0];
m.y+=dis[i][1];
if(InMap(m)==true&&state[m.x][m.y]==0&&map[m.x][m.y]==0)
{
father[m.x][m.y].x=m.x-dis[i][0];
father[m.x][m.y].y=m.y-dis[i][1];
if(m.x==4&&m.y==4)
{
IsOk(m);
return ;
}
Q.push(m);
state[m.x][m.y]=1;
}
m.x-=dis[i][0];
m.y-=dis[i][1];
}
}
}
int main()
{
int i,j;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
cin>>map[i][j];
state[i][j]=0;
father[i][j].x=i;
father[i][j].y=j;
}
}
bfs();
while(!S.empty())
{
cout<<"("<<S.top().x<<", "<<S.top().y<<")"<<endl;
S.pop();
}
return 0;
}
原创粉丝点击