关于BFS的总结

来源:互联网 发布:ati mac驱动放在哪里 编辑:程序博客网 时间:2024/05/21 09:50

最近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;}



0 0
原创粉丝点击