正文
洛谷 P1747 好奇怪的游戏
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
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
说明
输入样例#1: 复制
12 16
18 10
输出样例#1: 复制
8
9
100%数据:x1,y1,x2,y2<=20
思路:搜索。
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int x1,x2,y1,y2;
int vis[][];
int ans=0x7f7f7f7f;
int dx[]={,,,,,,-,-,-,-,-,-};
int dy[]={-,-,,,-,,-,,-,-,,};
struct nond{
int x,y,step;
};
void bfs(int x,int y){
queue<nond>que;
nond tmp;tmp.x=x;tmp.y=y;tmp.step=;
que.push(tmp);
while(!que.empty()){
nond now=que.front();
que.pop();
for(int i=;i<;i++){
nond c;
c.x=now.x+dx[i];
c.y=now.y+dy[i];c.step=now.step+;
if(c.x>=&&c.y>=&&c.x<=&&c.y<=&&!vis[c.x][c.y]){
vis[c.x][c.y]=now.step+;
que.push(c);
}
}
if(vis[][])
break;
}
}
int main(){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);vis[x1][y1]=;vis[x2][y2]=;
bfs(x1,y1);cout<<vis[][]<<endl;memset(vis,,sizeof(vis));vis[x2][y2]=;
bfs(x2,y2);cout<<vis[][];
}