洛谷——P1747 好奇怪的游戏

时间:2023-07-13 17:17:40

P1747 好奇怪的游戏

题目背景

《爱与愁的故事第三弹·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

bfs

由于要进行两遍bfs,数组与队列记得要清空!

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 110
using namespace std;
bool vis[N][N];
int x1,y1,x2,y2,nx,ny,ans,dis[N][N];
]={,,,,,,-,-,-,-,-,-};
]={-,,-,-,,,-,,-,,-,};
int read()
{
    ,f=; char ch=getchar();
    ;ch=getchar();}
    +ch-',ch=getchar();
    return  x*f;
}
struct Node
{
    int x,y;
}node,p;
queue<Node>q;
void bfs(int x,int y)
{
    while(!q.empty()) q.pop();
    memset(vis,,sizeof(vis));
    memset(dis,,sizeof(dis));
    node.x=x,node.y=y;dis[x][y]=;
    q.push(node);vis[x][y]=true;
    while(!q.empty())
    {
        p=q.front();q.pop();
        x=p.x,y=p.y;
        &&y==) {ans=dis[x][y];return ;}
        ;i<;i++)
        {
            nx=x+xx[i],ny=y+yy[i];
            ||ny>||nx<||ny<||vis[nx][ny]) continue;
            vis[nx][ny]=true;
            dis[nx][ny]=dis[x][y]+;
            p.x=nx,p.y=ny,q.push(p);
        }
    }
}
int main()
{
    x1=read(),y1=read();
    bfs(x1,y1);printf("%d\n",ans);
    x2=read(),y2=read();
    bfs(x2,y2);printf("%d",ans);
    ;
}