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:
- 在bfs中,开始位置的距离要设为0。