最近BFS类型的题目也做了不少了,总结一下大体思路:
具体问题具体改变,一般都是这个解法
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=100;
<span style="font-family: Arial, Helvetica, sans-serif;">const int INF=1000000;</span>
int map[maxn][maxn] //存储每个点的状态
int sx,sy,gx,gy;//起点和目标点的坐标
int num[maxn][maxn];//记录某点到起点的步数
int dir[4][2]={0,1,0,-1,1,0,-1,0}; // 方向向量
struct point // BFS 队列中的状态数据结构
{
int x,y; // 坐标位置
int Step_Counter; // 搜索步数统计器
};
point p1,p2;
void bfs(int x,int y)
{
p1.x=x;
p1.y=y;
p1.Step_Counter=0;
queue <point> q;// BFS 队列
num[x][y]=0;
q.push(p1); // 入队
while(!q.empty())
{
p1=q.front();
q.pop();
if(p1.x==gx&&p1.y==gy) // 出现目标态,此时为Step_Counter 的最小值,可以退出即可
{
...... //其实就可以结束了,一般加个break结束就行了
return;
}
for(int i=0;i<4;i++)
{
int fx=p1.x+dir[i][0];// 按照规则生成 下一个状态
int fy=p1.y+dir[i][1];
if(fx>=0&&fx<n&&fy>=0&&fy<n)//在这个可行驶的图中
{
if(num[fx][fy]>num[p1.x][p1.y]+1)//走或不走取最小值,默认走一步
{
num[fx][fy]=num[p1.x][p1.y]+1;
p2.x=fx;
p2.y=fy;
p2.Step_Counter=num[fx][fy];
q.push(p2);
}
}
}
}
return;
}
int main()
{
......
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
map[i][j]//取合适的值存
num[i][j]=INF//默认取一个很大数
}
bfs(sx,sy);
cout<<num[gx][gy]<<endl;
return 0;
}