好奇怪的游戏

题目背景

《爱与愁的故事第三弹·shopping》娱乐章。

调调口味来道水题。

题目描述

爱与愁大神坐在公交车上无聊,于是玩起了手机。一款奇怪的游戏进入了爱与愁大神的眼帘:***(游戏名被打上了马赛克)。这个游戏类似象棋,但是只有黑白马各一匹,在点x1,y1和x2,y2上。它们得从点x1,y1和x2,y2走到1,1。这个游戏与普通象棋不同的地方是:马可以走“日”,也可以像象走“田”。现在爱与愁大神想知道两匹马到1,1的最少步数,你能帮他解决这个问题么?

输入格式

第1行:两个整数x1,y1

第2行:两个整数x2,y2

输出格式

第1行:黑马到1,1的距离

第2行:白马到1,1的距离

输入输出样例

输入 #1
12 16
18 10
输出 #1
8 
9

说明/提示

100%数据:x1,y1,x2,y2<=20

从马开始所在的坐标开始搜索,搜索这个点到每一个点的最短步数。最后输出1,1这个坐标点的最短步数就OK了。

而且如果我们自己在图上推如何去求最短步数便可得(推导过程略,自力更生丰衣足食)

当前的结点的父节点+1的值,因此便可以直接使用BFS进行移动,然后把12个方向分别分成这一行的当前节点的12的子节点(如果12个方向符合不超出边界且没走过的情况),然后依次向下,直到所有的都过一遍。

#include<cstdio>
#include<cstring>
int dx[12]={2,-2,2,-2,1,1,-1,-1,2,2,-2,-2};

int dy[12]={2,2,-2,-2,2,-2,2,-2,1,-1,1,-1};

int b[1001][1001],que[100001][3],a[1001][1001];

int BFS(int x,int y){
    int tail=1,head=0;
    que[tail][0]=x;
    que[tail][1]=y;
    b[x][y]=1;
    do{
        head++;
        for (int i=0;i<12;i++){
            int x1=que[head][0]+dx[i];
            int y1=que[head][1]+dy[i];
            if (x1>=1 && x1<=50 && y1<=50 & y1>=1 && b[x1][y1]==0){
                tail++; 
                que[tail][0]=x1;
                que[tail][1]=y1;
                b[x1][y1]=1;
                a[x1][y1]=a[que[head][0]][que[head][1]]+1;
            }
        }
    }while (head<tail);
    return a[1][1];
}

int main(){
    int x1,y1,i,j;
    scanf("%d%d",&x1,&y1);
    printf("%d
",BFS(x1,y1));
    memset(b,0,sizeof(b)); 
    memset(que,0,sizeof(que));
    memset(a,0,sizeof(a));
    scanf("%d%d",&x1,&y1);
    printf("%d
",BFS(x1,y1));
    return 0;
}
原文地址:https://www.cnblogs.com/hrj1/p/11191904.html