码迷,mamicode.com
首页 > 其他好文 > 详细

Knight Moves (双向bfs)

时间:2018-09-03 22:59:26      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:push   print   https   pre   turn   双向bfs   代码   images   bfs   

# 10028. 「一本通 1.4 例 3」Knight Moves

【题目描述】

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

技术分享图片

【算法】

双向bfs。

【代码】

#include <bits/stdc++.h>
#define P pair<int,int>
#define ff first
#define ss second
using namespace std;
int T,ans;
int d1[310][310],d2[310][310];
const int dx[8]={-2,-1,1,2,2,1,-1,-2},dy[8]={1,2,2,1,-1,-2,-2,-1};
int main() {
    scanf("%d",&T);
    while(T--) {
        ans=2e9;
        int L; 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++)
                d1[i][j]=d2[i][j]=-1;
        queue<P> q1,q2;
        q1.push(x),d1[x.ff][x.ss]=0;
        q2.push(y),d2[y.ff][y.ss]=0;
        while(q1.size()&&q2.size()) {
            P now1=q1.front(); q1.pop();
            P now2=q2.front(); q2.pop();
            if(d2[now1.ff][now1.ss]!=-1) {
                ans=min(ans,d1[now1.ff][now1.ss]+d2[now1.ff][now1.ss]);
                break;
            }
            if(d1[now2.ff][now2.ss]!=-1) {
                ans=min(ans,d1[now2.ff][now2.ss]+d2[now2.ff][now2.ss]);
                break;
            }
            for(int i=0;i<8;i++) {
                int nx=now1.ff+dx[i],ny=now1.ss+dy[i];
                if(nx>=1&&nx<=L&&ny>=1&&ny<=L&&d1[nx][ny]==-1) {
                    d1[nx][ny]=d1[now1.ff][now1.ss]+1;
                    q1.push(make_pair(nx,ny));
                }
            }
            for(int i=0;i<8;i++) {
                int nx=now2.ff+dx[i],ny=now2.ss+dy[i];
                if(nx>=1&&nx<=L&&ny>=1&&ny<=L&&d2[nx][ny]==-1) {
                    d2[nx][ny]=d2[now2.ff][now2.ss]+1;
                    q2.push(make_pair(nx,ny));
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

Knight Moves (双向bfs)

标签:push   print   https   pre   turn   双向bfs   代码   images   bfs   

原文地址:https://www.cnblogs.com/Willendless/p/9581576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!