3004 棋盘上的距离

问题描述:

国际象棋的棋盘是黑白相间的8 * 8的方格,棋子放在格子中间。如图3.1所示:

图3.1 国际象棋棋盘示意图

王、后、车、象的走子规则如下:

  1. 王:横、直、斜都可以走,但每步限走一格。
  2. 后:横、直、斜都可以走,每步格数不受限制。
  3. 车:横、竖均可以走,不能斜走,格数不限。
  4. 象:只能斜走,格数不限。

写一个程序,给定起始位置和目标位置,计算王、后、车、象从起始位置走到目标位置所需的最少步数。

输入:

第一行是测试数据的组数t(0 <= t <= 20)。以下每行是一组测试数据,每组包括棋盘上的两个位置,第一个是起始位置,第二个是目标位置。位置用"字母-数字"的形式表示,字母从“a”到“h”,数字从“1”到“8”。

输出:

对输入的每组测试数据,输出王、后、车、象所需的最少步数。如果无法到达,就输出“Inf”。

输入样例:

2
a1 c3
f5 f8

输出样例: 

2 1 2 1 
3 1 1 Inf

代码(注意每种棋的走棋规律,结合棋的走法)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char *argv[]) {
	int t,i,j,x,y;
	char l[2],n[2];
	scanf("%d",&t);
	for(i=0;i<t;i++){
		getchar();//吞掉回车
		for(j=0;j<2;j++){
			scanf("%c",l+j);
			scanf("%d",n+j);
			if(j==0) scanf(" ");//两个坐标输入输入间的空格
		}
		int wang,hou,ju,xiang;
		x=abs(l[1]-l[0]);//x与y均为起点与终点坐标的差值
		y=abs(n[1]-n[0]);
		if(x==0){
			wang=y;
			hou=1;
			ju=1;
			if(abs(x-y)&1) xiang=-1;//如果起点与终点格子颜色不同,则象走不到。这里是位运算,表示x与y的差值为奇数
			else xiang=2;
		}
		else if(y==0){
				wang=x;
				hou=1;
				ju=1;
				if(abs(x-y)&1) xiang=-1;//同上
				else xiang=2;
			}
			else if(x==y){
					wang=x;
					hou=1;
					ju=2;
					xiang=1;
				}
				else{
					wang=(x<y?x:y)+abs(x-y);
					hou=2;
					ju=2;
					if(abs(x-y)&1) xiang=-1;
					else xiang=2;
				}
		printf("%d %d %d ",wang,hou,ju);
		if(xiang==-1) printf("lnf\n");
		else printf("%d\n",xiang);
	} 
	return 0;
}

下面这个输入会简单一点,用字符串数组。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char *argv[]) {
	char start[2],dest[2];
	int t;
	int wang,hou,ju,xiang;
	scanf("%d",&t);
	while(t--){
		scanf("%s %s",start,dest);//字符串数组
		int x=abs(dest[0]-start[0]);
		int y=abs(dest[1]-start[1]);
		int wang,hou,ju,xiang;
		if(x==0&y==0) wang=hou=ju=xiang=0;//起点与终点相同 
		else if(x==0){//水平方向无变化 
			wang=y;
			hou=1;
			ju=1;
			if(y%2!=0) xiang=-1;//起点终点颜色不同。也可以用位运算
			else xiang=2;
		}
			else if(y==0){//垂直方向无变化 
				wang=x;
				hou=1;
				ju=1;
				if(x%2!=0) xiang=-1;//也可以用位运算
				else xiang=2;
			}
				else if(x==y){//起点与终点在同一对角线 
					wang=x;
					hou=1;
					ju=2;
					xiang=1;
				}
					else{//起点与终点不在同一条对角线 
						wang=abs(x-y)+(x<y?x:y);
						hou=2;
						ju=2;
						if((x-y)%2!=0) xiang=-1;//这个条件可以用位运算,(x-y)&1为真表示(x-y)为奇数
						else xiang=2;
					}
		printf("%d %d %d",wang,hou,ju);
		if(xiang!=-1) printf(" %d\n",xiang);
		else printf(" lnf\n");
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值