题目背景
《爱与愁的故事第三弹·shopping》娱乐章。
调调口味来道水题。
题目描述
爱与愁大神坐在公交车上无聊,于是玩起了手机。一款奇怪的游戏进入了爱与愁大神的眼帘:***(游戏名被打上了马赛克)。这个游戏类似象棋,但是只有黑白马各一匹,在点 x1,y1 和 x2,y2 上。它们得从点 x1,y1 和 x2,y2 走到 (1,1)。这个游戏与普通象棋不同的地方是:马可以走“日”,也可以像象走“田”。现在爱与愁大神想知道两匹马到 (1,1) 的最少步数,你能帮他解决这个问题么?
注意不能走到 x 或 y 坐标 ≤0 的位置。
输入格式
第一行两个整数 x1,y1。
第二行两个整数 x2,y2。
输出格式
第一行一个整数,表示黑马到 (1,1) 的步数。
第二行一个整数,表示白马到 (1,1) 的步数。
输入输出样例
输入 #1复制
12 16 18 10
输出 #1复制
8 9
说明/提示
数据范围及约定
对于 100% 数据,1≤x1,y1,x2,y2≤20。
#include<bits/stdc++.h>
using namespace std;
int x2,y2,x3,y3;
int visited[25][25];
char a[25][25];
int next1[12][2]={{2,1},{2,-1},{1,2},{1,-2},{-2,1},{-2,-1},{-1,2},{-1,-2},{2,2},{-2,-2},{2,-2},{-2,2}};
struct node{
int x;
int y;
};
queue<node>q;
bool check(int x,int y)
{
if(visited[x][y]>0)
{
return false;
}
if(x<1||x>20)
{
return false;
}
if(y<1||y>20)
{
return false;
}
return true;
}
void bfs(int x,int y)
{
memset(visited,0,sizeof(visited));
visited[x][y]=1;
q.push((node{x,y}));
while(q.size())
{
int t1=q.front().x;
int t2=q.front().y;
q.pop();
for(int i=0;i<12;i++)
{
int xx=t1+next1[i][0];
int yy=t2+next1[i][1];
if(check(xx,yy))
{
visited[xx][yy]=visited[t1][t2]+1;
q.push((node){xx,yy});
}
}
}
}
int main ()
{
cin>>x2>>y2;
cin>>x3>>y3;
bfs(x2,y2);
cout<<visited[1][1]-1<<endl;
bfs(x3,y3);
cout<<visited[1][1]-1<<endl;
return 0;
}