POJ 1915 Knight Moves 双向搜索

来源:互联网 发布:蜜桃tv源码程序 编辑:程序博客网 时间:2024/06/05 10:29

题意:经典的马步移动。问从一个点到另一个点的最短距离。

分析:直接DFS即可,这里用这题写个双向BFS练手。


Code:

#include <iostream>#include <cstring>#include <cstdio>#include <queue>using namespace std;const int maxn=310;int vis[maxn][maxn];int dir[8][2]={{-2,1},{-2,-1},{2,1},{2,-1},{1,-2},{1,2},{-1,-2},{-1,2}};struct node{    int x,y;    node(){}    node(int xx,int yy):x(xx),y(yy){}};int n,cas,sx,sy,ex,ey;bool OK(int x,int y){    if(x>=0&&x<n&&y>=0&&y<n) return true;    return false;}int bfs(){    if(sx==ex&&sy==ey) return 0;    queue<node>f,t;    vis[sx][sy]=1;    vis[ex][ey]=2;    int s1=0,s2=0;    f.push(node(sx,sy));    t.push(node(ex,ey));    while((!f.empty())||(!t.empty())){          bool flag=false;          if(!f.empty()){             int sz=f.size();             while(sz--){//每次扩展一层                node cur=f.front(); f.pop();                for(int i=0;i<8;i++){                    int tx=cur.x+dir[i][0];                    int ty=cur.y+dir[i][1];                    if(OK(tx,ty)){                        if(vis[tx][ty]==2){flag=true;break;}                        if(vis[tx][ty]==1) continue;                        vis[tx][ty]=1;                        f.push(node(tx,ty));                    }                }                if(flag) break;             }             s1++;          }          if(flag) return s1+s2;          if(!t.empty()){            int sz=t.size();            while(sz--){//每次扩展一层                node cur=t.front(); t.pop();                for(int i=0;i<8;i++){                    int tx=cur.x+dir[i][0];                    int ty=cur.y+dir[i][1];                    if(OK(tx,ty)){                        if(vis[tx][ty]==1){flag=true; break;}                        if(vis[tx][ty]==2) continue;                        vis[tx][ty]=2;                        t.push(node(tx,ty));                    }                }                if(flag) break;            }            s2++;          }          if(flag) return s1+s2;    }    return 0;}int main(){    scanf("%d",&cas);    while(cas--){        scanf("%d",&n);        scanf("%d %d %d %d",&sx,&sy,&ex,&ey);        memset(vis,0,sizeof(vis));        printf("%d\n",bfs());    }    return 0;}


原创粉丝点击