您的位置:首页 > 其它

POJ 1657 Distance on Chessboard 解题报告

2017-03-09 20:45 471 查看

POJ 1657 : Distance on Chessboard

描述

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



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

王:横、直、斜都可以走,但每步限走一格。

后:横、直、斜都可以走,每步格数不受限制。

车:横、竖均可以走,不能斜走,格数不限。

象:只能斜走,格数不限。

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

输入

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

输出

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

样例输入

2

a1 c3

f5 f8

样例输出

2 1 2 1

3 1 1 Inf

来源

POJ Monthly–2004.05.15 Liu Rujia@POJ

思路分析:

首先分析四种棋子的行走规则,不妨设当前棋子的坐标为(i,j),若终止位置与开始位置不重合,进行如下分析:

1)King一次只能走一格,直走或是斜走。直走只在一个基本单位改变i或者是j,斜走的时候同时在一个单位内改变i和j,一直朝向终点位置则必可到达终点;

2)Queen一次走的格数不限,直走或是斜走不限,是King的强化版情况,显然Queen只需要走一步或者是两步;

3)Rook只能直走,格数不限,Rooc也只需要一步或者是两步即可到达;

4)Bishop只能斜走,格数不限,比较有意思的是,根据棋盘只有间隔的两个颜色,根据论证,不同颜色的格点之间不能互相到达。所以,同色的格点之间彼此必能到达,步数为1或者是2,不同色的格点之间不可达到。

(以上左右的步数不限均默认当前的移动后依然在ChessBoard上,将上述的行走规则翻译为条件判断)

#include <iostream>
#include <string.h>
#include <math.h>
char be_pos[5], end_pos[5];
int step_king, step_queen, step_rook, step_bishop;
void cal_step()
{
int dx, dy;
dx = fabs(end_pos[0] - be_pos[0]);//得到在dx位置上和dy位置上的绝对偏移
dy = fabs(end_pos[1] - be_pos[1]);
step_king = (dx > dy ? dy : dx) + fabs(dy - dx);    //for king
if (dx != 0 && dy != 0 && dx != dy)             //for queen
step_queen = 2;
if (dx !=
4000
0 && dy != 0)                         //for rook
step_rook = 2;
bool kind_1 = (end_pos[0] + end_pos[1]) % 2;
bool kind_2 = (be_pos[0] + be_pos[1]) % 2;
if (kind_1 == kind_2)
{
if (dx != dy)
step_bishop = 2;
printf("%d %d %d %d\n", step_king, step_queen, step_rook, step_bishop);
}
else
printf("%d %d %d %s\n", step_king, step_queen, step_rook, "Inf");

}
int main()
{
int k;
scanf("%d", &k);
while (k--)
{
scanf("%s%s", be_pos, end_pos);
if (!strcmp(be_pos, end_pos))//当起始位置与终止位置重合,步数都为0
{
printf("0 0 0 0\n");
continue;
}
//首先赋予了四种棋子默认的合法值,注意step_bishop可能会有值,但是无效
step_king = step_queen = step_rook = step_bishop = 1;
cal_step();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj