题目背景
《爱与愁的故事第三弹·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) 的步数
输入样例
12 16
18 10
输出样例
8
9
数据范围
对于 100% 数据:x1, y1, x2, y2 ≤ 20
题解
BFS:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define x first
#define y second
using namespace std;
typedef pair<int, int > PII;
const int N = 25;
int x, y;
int dist[N][N];
int dx[12] = {
1, 1, -1, -1, 2, 2, -2, -2, -2, -2, 2, 2};
int dy[12] = {
2, -2, 2, -2, 1, -1, 1, -1, -2, 2, -2, 2};
int bfs(int x, int y)
{
queue<PII> q;
q.push(make_pair(1, 1));
dist[1][1] = 0;
while(q.size())
{
PII t = q.front();
q.pop();
if(t.x == x && t.y == y) return dist[x][y];
for (int i = 0; i < 12; i ++)
{
int a = t.x + dx[i], b = t.y + dy[i];
if(a < 1 || a > 20 || b < 1 || b > 20 || dist[a][b] != -1) continue;
q.push(make_pair(a, b));
dist[a][b] = dist[t.x][t.y] + 1;
}
}
}
int main()
{
cin >> x >> y;
memset(dist, -1, sizeof dist);
cout << bfs(x, y) << endl;
cin >> x >> y;
memset(dist, -1, sizeof dist);
cout << bfs(x, y) << endl;
return 0;
}