BFS(模板)

来源:互联网 发布:如何导入sql数据库 编辑:程序博客网 时间:2024/06/06 04:29

转载请注明出处:http://blog.csdn.net/u012860063

BFS模板题(跳马):

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#include <queue>#define M 1000struct node{int x,y; //点的坐标int step;//记录走到当前点的步数};int xx[8]={-2,-1,1,2,2,1,-1,-2}; //记录走动的八个方向int yy[8]={1,2,2,1,-1,-2,-2,-1};bool visit[M][M];//标记当前点是否访问过int n,ansx,ansy;queue<node>q;int BFS(int x,int y)//广度优先搜索{        if(x==ansx&&y==ansy)//如果起点就是终点,则步数为0               return 0;        int dx,dy,i;        node front,rear;        front.x=x,front.y=y,front.step=0;        q.push(front);        visit[x][y]=true;        while(!q.empty())//判断队列是否为空       {              front=q.front();//队首元素出队              q.pop();              for(i=0;i<8;i++)              {                   dx=front.x+xx[i],dy=front.y+yy[i];                   if(dx>=0&&dx<n&&dy>=0&&dy<n&&!visit[dx][dy])//判断是否在图中且有无访问过                   {                            visit[dx][dy]=true;//标记当前点已访问过                            if(dx==ansx&&dy==ansy)//判断当前点是否为终点                                     return front.step+1;                            rear.x=dx,rear.y=dy,rear.step=front.step+1;//步数为父节点(起始点)步数加1                            q.push(rear);                  }              }      }}int main(){        int t,i,x,y,ans;        scanf("%d",&t);        while(t--)       {                while(!q.empty())//清空队列                      q.pop();                memset(visit,false,sizeof(visit));//初始化为全都还没访问过                scanf("%d",&n);     //图的大小,图n*n的矩阵                scanf("%d%d",&x,&y);//起点                scanf("%d%d",&ansx,&ansy);//终点                ans=BFS(x,y);//返回最小步数                printf("%d\n",ans);       }       return 0;}

1 0