我只是想要一下这两个的模板代码(c++的)
网上的看不大懂,所以来问一下各位;
然后BFS的模板最好加上一点注释,不然我可能会看的有点蒙
BFS算法:
通常用队列(先进先出,FIFO)实现
初始化队列Q;
Q = {起点s};
标记s为已访问;
while(Q非空)
{
取Q队首元素u;
u出队;
if(u==目标状态)
{
……
}
else
{
所有与u相邻且未被访问的点进入队列;
标记u为已访问;
}
}
//BFS算法框架
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 100;
bool mark[maxn][maxn]; //访问标记
int go[4][2] = {0,-1,1,0,0,1,-1,0}; //方向向量
struct State
{
int x,y; //坐标位置
int step; //搜索步数记录
};
State maze[maxn];
bool CheckState(State s)
{
if(!mark[s.x][s.y]&&(边界条件满足)) //符合条件
return 1;
else //不符合条件
return 0;
}
void BFS(State st)
{
queue<State> q;
State now,next;
st.step = 0; //步数清零;
q.push(st); //入队;
mark[st.x][st.y] = 1; //访问标记
while(!q.empty())
{
now = q.front(); //取队首元素进行拓展
q.pop(); //队首元素出队;
if(now == 目标状态) //出现目标状态,此时的step为最小值,做做相关处理后退出即可;
{
……;
return ;
}
//如果没有到目标状态:
else
{
for(int i=0;i<4;i++)
{
next.x = now.x + go[i][0];//按照规则生成下一个状态
next.y = now.y + go[i][1];
if(CheckState(next)) //如果状态满足条件则入队;
{
next.step = now.step + 1;
q.push(next);
}
}
}
return ;
}
}
int main()
{
……;
BFS();
……;
return 0;
}