P1747 好奇怪的游戏

好奇怪的游戏

题目背景

《爱与愁的故事第三弹·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,如果能回到过去,一定和自己说好好学数学,你想和过去的自己说什么呢?

P1747 好奇怪的游戏_第1张图片

#include
#include
#include
#include
#include
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不能用,好像库函数里相冲突了

你可能感兴趣的:(暑假笔记,算法,c++)