问题描述:
国际象棋的棋盘是黑白相间的8 * 8的方格,棋子放在格子中间。如图3.1所示:
图3.1 国际象棋棋盘示意图
王、后、车、象的走子规则如下:
- 王:横、直、斜都可以走,但每步限走一格。
- 后:横、直、斜都可以走,每步格数不受限制。
- 车:横、竖均可以走,不能斜走,格数不限。
- 象:只能斜走,格数不限。
写一个程序,给定起始位置和目标位置,计算王、后、车、象从起始位置走到目标位置所需的最少步数。
输入:
第一行是测试数据的组数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;
}