好奇怪的游戏
题目背景
《爱与愁的故事第三弹·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
样例输入 #1
12 16
18 10
 
样例输出 #1
8 
9
 
提示
100%数据:x1,y1,x2,y2<=20
一般的🐎都只能走日字,但是这个马与象相结合,能走日字和田字,所以偏移量数组就有12个,看到大佬有用数学公式推出来答案,直接跪了,tql,如果能回到过去,一定和自己说好好学数学,你想和过去的自己说什么呢?

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
int dx[12]={1,2,2,2,2,1,-1,-2,-2,-2,-2,-1};
int dy[12]={2,2,1,-1,-2,-2,-2,-2,-1,1,2,2};
const int N=30;
int g[N][N];
struct node{
	int x,y,step;
};
int x1,y3,x2,y2;
void bfs(int a,int b)
{
	queue<node> q;
	q.push({a,b});
	
	while(!q.empty())
	{
		node st=q.front();
		q.pop();
		for(int i=0;i<12;i++)
		{
			int x=st.x+dx[i],y=st.y+dy[i];
			if(x<1||y<1||x>30||y>30||g[x][y]==1)continue;
			if(g[x][y]==0)
			{
				q.push({x,y,st.step+1});
				g[x][y]=1;
			}
			if(x==1&&y==1)cout<<st.step+1<<endl;
		}
	}
}
int main()
{
	cin>>x1>>y3>>x2>>y2;
	bfs(x1,y3);
	memset(g,0,sizeof g);
	bfs(x2,y2);
	return 0;
}
 
y1不能用,好像库函数里相冲突了


















