问题描述
在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”。有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字。
他的同桌平时喜欢下围棋,知道这件事后觉得很有趣,就想试一试,在一个(100×100)的围棋盘上任选两点A、B,A点放上黑子,B点放上白子,代表两匹马。棋子可以按“日”字走,也可以按“田”字走,俩人一个走黑马,一个走白马。谁用最少的步数走到左上角坐标为(1,1)的点时,谁获胜。现在他请你帮忙,给你A、B两点的坐标,想知道两个位置到(1,1)点可能的最少步数。
格式
输入格式
A、B两点的坐标。
输出格式
最少步数。
样例
输入样例
12 16 18 10
输出样例
8 9
#include<stdio.h>
int horse[12][2]={{2,2},{2,-2},{-2,2},{-2,-2},{1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}};
int pre[1000000];
void step(int x)
{
int sum=0;
while(pre[x])
{
sum++;
x=pre[x];
}
printf("%d\n",sum);
}
void bfs(int a,int b)
{
int book[101][101]={0};
int que1[10000]={0};
int que2[10000]={0};
int hen,zon;
if(a==1&&b==1)
{
printf("0");
return;
}
int head=0;
int tail=1;
que1[1] = 1;
que2[1] = 1;
book[1][1]=1;
while(head != tail)
{
head++;
for(int i=0;i<12;i++)
{
hen=que1[head]+horse[i][0];
zon=que2[head]+horse[i][1];
if(hen<=100&&zon<=100&& book[hen][zon]==0 && hen>0&&zon>0)
{
tail++;
que1[tail]=hen;
que2[tail]=zon;
book[hen][zon]=1;
pre[tail]=head;
if(hen==a&&zon==b)
{
step(tail);
head=tail;
break;
}
}
}
}
}
int main()
{
int a,b,c,d;
scanf("%d%d",&a,&b);
scanf("%d%d",&c,&d);
bfs(a,b);
bfs(c,d);
return 0;
}