国际象棋的棋盘是黑白相间的8 * 8的方格,棋子放在格子中间。如下图所示:
王、后、车、象的走子规则如下:
- 王:横、直、斜都可以走,但每步限走一格。
- 后:横、直、斜都可以走,每步格数不受限制。
- 车:横、竖均可以走,不能斜走,格数不限。
- 象:只能斜走,格数不限。
写一个程序,给定起始位置和目标位置,计算王、后、车、象从起始位置走到目标位置所需的最少步数。
输入
第一行是测试数据的组数t(0 <= t <= 20)。以下每行是一组测试数据,每组包括棋盘上的两个位置,第一个是起始位置,第二个是目标位置。位置用"字母-数字"的形式表示,字母从"a"到"h",数字从"1"到"8"。
输出
对输入的每组测试数据,输出王、后、车、象所需的最少步数。如果无法到达,就输出"Inf".
样例输入
2 a1 c3 f5 f8
样例输出
2 1 2 1 3 1 1 Inf
注意尽量减少while(t--),因为不同编译器处理可能不同,所以我们需要尽可能减少使用
#include<stdio.h>
#include<math.h>
int main(void){
int t;
char begain[2],end[2];
scanf("%d",&t);
for(i=0;i<t;i++){
scanf("%s%s",begain,end);
int x=abs(end[0]-begain[0]);
int y=abs(end[1]-begain[1]);
//对于王,将x,y比较谁大就是谁,因为小的那个会被斜着走抵消,剩下的就是大的要走
//斜着走相当于走了一个x和一个y
if(x==0&&y==0)printf("%d %d %d %d\n",0,0,0,0);//一定不能忘记,很可能就是没走呢
else{printf("%d",x>y?x:y);
//对于后:当x和y一样时或x=0,y=0,直接斜着就可以走到,除此之外就是两步
printf(" %d",(x==y||x==0||y==0)?1:2);
//对于车:当x或y有一个存在为0时就是1,否则就是2;
printf(" %d",(x==0||y==0)?1:2);
//对于象:看x与y的差,若为奇数,那么就不可以到达,因为无法弥补,不可以斜着走,所以不可到达
//若为偶数那么就走两步,一步用来弥补差数(因为是偶数,所以可以通过平分奇数来使x==y),一步斜着走到终点
//若x==y,那么就可以一步走到
if(x==y)printf(" %d",1);
else if(abs(x-y)%2==0)printf(" %d",2);
else printf(" Inf");
printf("\n");
}
}
return 0;
}