好奇怪的游戏
题目背景
《爱与愁的故事第三弹·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不能用,好像库函数里相冲突了