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
这题目挺有意思所以写了下来。第一眼看见它就想马上广搜........定眼一看不对劲,王 后 车 象 的走法很是霸气。然后就找规律了。
我考虑了四种情况的摆放:同一水平,同一竖线,同一斜线,和其他。 四种情况的最少步数其实基本差不多..........关键是象只能斜着走,于是我用0,1,模拟棋盘的黑白色,来判断象能否到达目标点........没去优化,代码重复较多。
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
using namespace std;
int map[10][10];
int hori(int x1,int y1,int x2,int y2)//是否水平
{
if(y1 == y2)
return true;
return false;
}
int vert(int x1,int y1,int x2,int y2)//是否竖线
{
if(x1 == x2)
return true;
return false;
}
int spl(int x1,int y1,int x2,int y2)//是否斜线,斜率为+ -1
{
if(abs(x1-y1) == abs(x2-y2) || abs(x1+y1) == abs(x2+y2))
return true;
return false;
}
bool color(int x1,int y1,int x2,int y2 )//判断象能否到达
{
if(map[x1][y1] == map[x2][y2])
return true;
return false;
}
int main()
{
int n,i,j,x1,x2,y1,y2;
char a[3],b[3];
scanf("%d",&n);
for(i=0; i<8; i++)//制造黑白棋盘
{
if(i%2 == 0)
map[i][0] = 1;
else
map[i][0] = 0;
for(j=1; j<8; j++)
{
map[i][j]=1 - map[i][j-1];
}
}
while(n--)
{
cin >> a >> b;
x1=a[0] - 'a';
y1=a[1] - '1';
x2=b[0] - 'a';
y2=b[1] - '1';
if(strcmp(a,b) == 0)//起点终点为一点
{
printf("0 0 0 0\n");
continue;
}
if(hori(x1,y1,x2,y2) )//水平
{
printf("%d 1 1 ",abs(x1-x2));
if(color(x1,y1,x2,y2) )
printf("2\n");
else
printf("Inf\n");
}
else if(vert(x1,y1,x2,y2) )//竖直
{
printf("%d 1 1 ",abs(y1-y2));
if(color(x1,y1,x2,y2) )
printf("2\n");
else
printf("Inf\n");
}
else if(spl(x1,y1,x2,y2) )//斜线
{
printf("%d 1 2 ",abs(y1-y2));
if(color(x1,y1,x2,y2) )
printf("1\n");
else
printf("Inf\n");
}
else//其他
{
printf("%d 2 2 ",abs(y1-y2)+abs(x1-x2));
if(color(x1,y1,x2,y2) )
printf("2\n");
else
printf("Inf\n");
}
}
return 0;
}