hdu1372Knight Moves

来源:互联网 发布:数据增值服务内容 编辑:程序博客网 时间:2024/06/03 07:18

入门bfs搜索题,题意为给点起点终点问最少多少步到达,使用双向bfs,比盲搜时间
快了将近一倍

#include <cstdio>#include <queue>using namespace std;const int dir[8][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}};struct node{    int x,y;};typedef pair <node,int> pii;bool in(int x,int y){    if(x<=8&&x>0&&y<=8&&y>0)        return true;    return false;}int main(){    char A[5],B[5];    while(scanf("%s%s",A,B)!=EOF){        int qp[9][9];        for(int i=1;i<=8;i++)            for(int j=0;j<=8;j++)                qp[i][j]=0;        node Begin={A[0]-96,A[1]-48};        node End={B[0]-96,B[1]-48};        if(Begin.x==End.x&&Begin.y==End.y){            printf("To get from %s to %s takes 0 knight moves.\n",A,B);            continue;        }        qp[Begin.x][Begin.y]=1;        qp[End.x][End.y]=2;        queue<pii> q;        queue<pii> p;        q.push(make_pair(Begin,0));        p.push(make_pair(End,0));        int flag=1;        int ans1=0,ans2=0;        while(flag){            int cnt1=q.size();            while(cnt1--&&!q.empty()&&flag){                pii pi=q.front();                q.pop();                int nowx=pi.first.x;                int nowy=pi.first.y;                ans1=pi.second+1;                for(int i=0;i<8;i++){                        if(in(nowx+dir[i][0],nowy+dir[i][1])){                    if(qp[nowx+dir[i][0]][nowy+dir[i][1]]==0){                            node lin={nowx+dir[i][0],nowy+dir[i][1]};                          q.push(make_pair(lin,ans1));                          qp[lin.x][lin.y]=1;                       }                    else if(qp[nowx+dir[i][0]][nowy+dir[i][1]]==2){                        printf("To get from %s to %s takes %d knight moves.\n",A,B,ans1+ans2);                        flag=0;                        break;                    }                        }                }            }            int cnt2=p.size();            while(cnt2--&&!p.empty()&&flag){                pii pi=p.front();                p.pop();                int nowx=pi.first.x;                int nowy=pi.first.y;                ans2=pi.second+1;                for(int i=0;i<8;i++){                        if(in(nowx+dir[i][0],nowy+dir[i][1])){                    if(qp[nowx+dir[i][0]][nowy+dir[i][1]]==0){                            node lin={nowx+dir[i][0],nowy+dir[i][1]};                          p.push(make_pair(lin,ans1));                          qp[lin.x][lin.y]=2;                       }                        else if(qp[nowx+dir[i][0]][nowy+dir[i][1]]==1){                        printf("To get from %s to %s takes %d knight moves.\n",A,B,ans1+ans2);                        flag=0;                        break;                        }                }                }            }        }    }    return 0;}


0 0
原创粉丝点击