好奇怪的游戏
题目背景
《爱与愁的故事第三弹·shopping》娱乐章。
调调口味来道水题。
题目描述
爱与愁大神坐在公交车上无聊,于是玩起了手机。一款奇怪的游戏进入了爱与愁大神的眼帘:***(游戏名被打上了马赛克)。这个游戏类似象棋,但是只有黑白马各一匹,在点 x 1 , y 1 x_1,y_1 x1,y1 和 x 2 , y 2 x_2,y_2 x2,y2 上。它们得从点 x 1 , y 1 x_1,y_1 x1,y1 和 x 2 , y 2 x_2,y_2 x2,y2 走到 ( 1 , 1 ) (1,1) (1,1)。这个游戏与普通象棋不同的地方是:马可以走“日”,也可以像象走“田”。现在爱与愁大神想知道两匹马到 ( 1 , 1 ) (1,1) (1,1) 的最少步数,你能帮他解决这个问题么?
注意不能走到 x x x 或 y y y 坐标 ≤ 0 \le 0 ≤0 的位置。
输入格式
第一行两个整数 x 1 , y 1 x_1,y_1 x1,y1。
第二行两个整数 x 2 , y 2 x_2,y_2 x2,y2。
输出格式
第一行一个整数,表示黑马到 ( 1 , 1 ) (1,1) (1,1) 的步数。
第二行一个整数,表示白马到 ( 1 , 1 ) (1,1) (1,1) 的步数。
样例 #1
样例输入 #1
12 16
18 10
样例输出 #1
8
9
提示
数据范围及约定
对于 100 % 100\% 100% 数据, 1 ≤ x 1 , y 1 , x 2 , y 2 ≤ 20 1\le x_1,y_1,x_2,y_2 \le 20 1≤x1,y1,x2,y2≤20。
#include<iostream>
#include<cstring>
#include<map>
using namespace std;
typedef pair<int ,int> PII;
#define x first
#define y second
const int N=30;
int d[N][N];
bool st[N][N];
int dx[]={-2,-2,-1,-1,1,1,2,2,-2,-2,2,2};
int dy[]={-1,1,2,-2,2,-2,-1,1,-2,2,-2,2};
PII q[N*N];
void bfs(int x1,int y1){
memset(st,false,sizeof st);
memset(d,-1,sizeof d);
int hh=0,tt=-1;
q[++tt]={x1,y1};
st[x1][y1]=true;
d[x1][y1]=0;
while(hh<=tt){
PII t=q[hh++];
for(int i=0;i<12;i++){
int x2=t.x+dx[i];
int y2=t.y+dy[i];
if(x2<1||x2>x1||y2<1||y2>y1)continue;
if(st[x2][y2])continue;
q[++tt]={x2,y2};
st[x2][y2]=true;
d[x2][y2]=d[t.x][t.y]+1;
if(x2==1&&y2==1)return;
}
}
}
int main(){
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
bfs(x1,y1);
cout<<d[1][1]<<'\n';
bfs(x2,y2);
cout<<d[1][1]<<'\n';
}