棋盘上的距离

棋盘上的距离

国际象棋的棋盘是黑白相间的8 * 8的方格,棋子放在格子中间。
王、后、车、象的走子规则如下:
•王:横、直、斜都可以走,但每步限走一格。 • 后:横、直、斜都可以走,每步格数不受限制。•车:横、竖均可以走,不能斜走,格数不限。 • 象:只能斜走,格数不限。
写一个程序,给定起始位置和目标位置,计算王、后、车、象从起始位置走到目标位置所需的最少步数。

在这里插入图片描述
代码如下
#include <stdio.h>
#include <math.h>
int main(){
int nCases,i;
scanf("%d",&nCases);
for(i=0;i<nCases;i++){
char begin[5],end[5];
scanf("%s%s",begin,end);
int x,y;
x=abs(begin[0]-end[0]);
y=abs(begin[1]-end[1]);
if(x== 0&&y == 0)
printf(“0000\n”);
else {
if(x<y){
m=x+abs(x-y);
printf("%d\n",m);
}
else{
m=y+abs(x-y);
printf("%d\n",n);
} //王的步数
if(x== y||x == 0||y== 0)
printf(“1\n”);
else
printf(“2\n”); //后的步数
if(x== 0||y == 0)
printf(“1\n”);
else
printf(“2\n”); //车的步数
if(abs(x-y)%2!=0)
printf(“Inf\n”);
else if(x==y)
printf(“1\n”);
else
printf(“2\n”); //象的步数
}
}
}
题目分析
(1)对于王,后,车,象的行走规则要清楚,根据规则分析不同情况。
(2)我们要先计算出水平方向与竖直方向上的起始位置与结束为止的距离,方便分析情况时找出最短的路程。
(3)王:可以横,直,斜走,每步限一格。因此王需要走的步数是x,y中较小一个加上x与y之差的绝对值。
后:可以横,直,斜走,步数不受限。因此x不等于y时,需走2步,其余情况走一步。
车:可以横竖走,步数不限。当x或y等于0时,步数为1,其余情况为2.。
象:可以斜走,步数不限。第一类是它的横坐标和纵坐标之差为奇数,第二类是横纵坐标之差为偶数。它每走一步,因为横纵坐标增加或减小的绝对值相等,所以横坐标和纵坐标之差的奇偶性无论如何行走都保持不变。因此上述的第一类点和第二类点不能互相到达。如果判断出起始点和终止点分别属于两类点,就可以得它们之间需要无数步的结论。如果它们属于同一类点,象从起始点走到终止点需要1(x的绝对值等于y的绝对值)或者2(x的绝对值不等于y的绝对值)。
总结
(1)对题目一定要理解!否则会绕进去想不通。
(2)要根据图做题分析,根据图多寻找,将所有的情况都要找出来。
(3)条件结构一定要注意对应关系,多条语句一定要加上大括号,不然运行结果会出错。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值