Knight Moves (双向bfs)

# 10028. 「一本通 1.4 例 3」Knight Moves
【题目描述】

编写一个程序,计算一个骑士从棋盘上的一个格子到另一个格子所需的最小步数。骑士一步可以移动到的位置由下图给出。

Picture 1

【算法】

双向bfs优先扩展节点数少的队列。什么破东西速度没快多少啊。。。。

【代码】
#include <stdio.h>
#include <queue>
#define P pair<int,int>
#define ff first
#define ss second
using namespace std;
int T,ans,L;
int d[310][310][2];
const int dx[8]={-2,-1,1,2,2,1,-1,-2},dy[8]={1,2,2,1,-1,-2,-2,-1};
queue<P> q[2];
bool work(int x,queue<P>& q) {
    P now=q.front(); q.pop();
    for(int i=0;i<8;i++) {
        int nx=now.ff+dx[i],ny=now.ss+dy[i];
        if(nx>=1&&nx<=L&&ny>=1&&ny<=L&&d[nx][ny][x]==-1) {
            d[nx][ny][x]=d[now.ff][now.ss][x]+1;
            if(d[now.ff][now.ss][x^1]!=-1) {
                ans=d[now.ff][now.ss][0]+d[now.ff][now.ss][1];
                return 1;
            }
            q.push(make_pair(nx,ny));
        }
    }
    return 0;
}
int main() {
    scanf("%d",&T);
    while(T--) {
        scanf("%d",&L);
        P x; scanf("%d%d",&x.ff,&x.ss); x.ff++,x.ss++;
        P y; scanf("%d%d",&y.ff,&y.ss); y.ff++,y.ss++;
        for(int i=1;i<=L;i++)
            for(int j=1;j<=L;j++)
                d[i][j][0]=d[i][j][1]=-1;
        queue<P> q[2];
        q[0].push(x),d[x.ff][x.ss][0]=0;
        q[1].push(y),d[y.ff][y.ss][1]=0;
        while(q[0].size()&&q[1].size()) {
            if(q[0].size()<q[1].size()) {
                if(work(0,q[0])) break;
            }else {
                if(work(1,q[1])) break;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

转载于:https://www.cnblogs.com/Willendless/p/9581576.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值