hdu1372Knight Moves

入门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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值