P1747 好奇怪的游戏

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的距离

输入输出样例

输入

12 16
18 10

输出

8 
9

说明/提示
100%数据:x1,y1,x2,y2<=20

题目思路:这道题我们可以反过来想
我们将白马和黑马的开始位置设为结束位置,这样我们
就减少了bfs的次数(否则需要两次遍历

#include<cstdio>
#include<iostream>
#include<cstring>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int dx[13]={0,-2,-2,2,2,-1,1,-1,1,-2,-2,2,2};
const int dy[13]={0,-1,1,-1,1,-2,-2,2,2,-2,2,-2,2};
int x1,y1,x2,y2,linex[910],liney[910],dis[25][25];
bool v[25][25];
void input()
{
	memset(dis,0x4f,sizeof(dis));
	scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
}
bool check(int x,int y)
{
	if(x>=1&&x<=20&&y>=1&&y<=20) return true;
	return false;
}
void bfs()
{
	linex[1]=1,liney[1]=1;
	dis[1][1]=0;
	int h=0,t=1;
	while(h<=t)
	{
		h++;
		int tx=linex[h],ty=liney[h];
		for(int i=1;i<=13;i++)
		{
			int nx=tx+dx[i],ny=ty+dy[i];
			if(check(nx,ny)&&dis[nx][ny]>dis[tx][ty]+1)
			{
				dis[nx][ny]=dis[tx][ty]+1;
				if(!v[nx][ny])
				{
					v[nx][ny]=1;
					t++;
					linex[t]=nx,liney[t]=ny;
				}
			}
		}
	}
}
int main()
{
	//fre();
	input();
	bfs();
	printf("%d\n%d\n",dis[x1][y1],dis[x2][y2]);
	return 0;
}

PS:

  1. 在bfs中,开始位置的距离要设为0。
发布了130 篇原创文章 · 获赞 93 · 访问量 6814

猜你喜欢

转载自blog.csdn.net/bigwinner888/article/details/105035198