程序竞赛--国际象棋

国际象棋的棋盘是黑白相间的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;
}

​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值