poj 1657 国际象棋棋盘上的距离

本文详细探讨了在国际象棋中,国王、皇后、车和象从任意起点到达终点所需的最少步数算法。通过精心设计的步骤和逻辑判断,解决了这一经典问题,对于棋迷和算法爱好者具有较高的研究价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给定国际象棋上的一个起点和一个终点,问王、后、车、象分别最少走多少步能从起点到终点。

思路:细心就可以。

#include <stdio.h>
#include <math.h>
#define max(a,b) ((a)>(b)?(a):(b))
int a,b,c,d,T;
int test1(){
	if(a==c || b==d)
		return 1;
	return 0;
}
int test2(){
	if(a+b == c+d || b-a == d-c)
		return 1;
	return 0;
}
int main(){
	freopen("a.txt","r",stdin);
	scanf("%d\n",&T);
	while(T--){
		char c1,c2,ch;
		scanf("%c%d%c%c%d\n",&c1,&b,&ch,&c2,&d);
		a = c1-'a'+1;
		c = c2-'a'+1;
		if(a==c && b==d){
			printf("0 0 0 0\n");
			continue;
		}
		printf("%d ",max(abs(a-c),abs(b-d)));//王就是横纵坐标差的大者
		if(test1())//如果起终点在横线或者直线上,那么王、后都可以直接到
			printf("1 1 ");
		else{
			if(test2())//在斜线上
				printf("1 2 ");
			else
				printf("2 2 ");
		}
		//判断象
		if(test2())//斜线上当然能够一步到
			printf("1\n");
		else if((a+b)%2 == (c+d)%2)//如果背景颜色相同,必能2步到
			printf("2\n");
		else
			printf("Inf\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值