1345: 国际象棋
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 123 Solved: 40
[ Submit][ Status][ Web Board]
Description
国际象棋的棋盘是黑白相间的8 * 8的方格,棋子放在格子中间。
王、后、车、象的走子规则如下:
王:横、直、斜都可以走,但每步限走一格。
后:横、直、斜都可以走,每步格数不受限制。
车:横、竖均可以走,不能斜走,格数不限。
象:只能斜走,格数不限。
你的任务是写一个程序,给定起始位置和目标位置,计算王、后、车、象从起始位置走到目标位置所需的最少步数。
Input
第一行是测试数据的组数t(0 <= t <= 20)。以下每行是一组测试数据,每组包括棋盘上的两个位置,第一个是起始位置,第二个是目标位置。位置用"字母-数字"的形式表示,字母从"a"到"h",数字从"1"到"8"。
Output
对于输入的每组测试数据,输出王、后、车、象所需的最少步数。如果无法到达,就输出"Inf".
Sample Input
2
a1 c3
f5 f8
Sample Output
2 1 2 1
3 1 1 Inf
HINT
请使用%s读入字符串
【解析】
这道题需要知道他们都是怎么走的之后就是需要注意的是斜着走相当于横着走加竖着走了一步。还有就是要算出x坐标上差了几步,y坐标上差了几步。知道了这些我们就可以做了
#include <cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
int n,x,y,a,b,c,q;
char s1[10];
char s2[10];
scanf("%d",&n);
while(n--)
{
scanf("%s%s",s1,s2);
x=fabs(s2[0]-s1[0]);//求x点相差多少
y=fabs(s2[1]-s1[1]);//求y点相差多少
if(x==0&&y==0)
{
printf("0 0 0 0\n");//起点和终点相等则不需要移动
continue;
}
a=min(x,y)+fabs(x-y);//因为斜着走一格相当于横着竖着都走一格了,所以就可以少走,所以这样可以算出最少多少步
q=fabs(x-y);
if((x==0)||(y==0)||(x==y))
b=1;//如果在同一行上或者同一列上或者同一条斜线上就只需要1步
else
b=2;//否则需要两步
if((x==0)||(y==0))
c=1;//如果在同一行或者同一列上只需要一步
else
c=2;//否则需要两步
if(x==y)
{
printf("%d %d %d 1\n",a,b,c);//在一条斜线上象只用走一步
}
else if(q%2!=0)
{
printf("%d %d %d Inf\n",a,b,c);//如果两者相减取余2不为0的话说明到不了因为斜着走是相当于横着走和竖着走一次
}
else
{
printf("%d %d %d 2\n",a,b,c);//否则需要两步可以到达
}
}
return 0;
}