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 1657 Distance on Chessboard 解题报告
- 百炼POJ 1657 Distance on Chessboard 解题报告
- OpenJudge/Poj 1657 Distance on Chessboard
- POJ 1657 Distance on Chessboard 简单的计算问题
- poj1657——Distance on Chessboard——简单题
- Distance on Chessboard POJ - 1657 简单模拟
- poj 1657 Distance on Chessboard(模拟贪心)
- poj1657——Distance on Chessboard
- POJ 1657 Distance on Chessboard
- poj 1657 Distance on Chessboard
- POJ 1657 Distance on Chessboard
- poj 1657 Distance on Chessboard
- POJ_1657_Distance on Chessboard
- poj 1657 Distance on Chessboard
- poj1657——Distance on Chessboard
- poj 1657 Distance on Chessboard
- POJ 百练 1657: Distance on Chessboard
- POJ 1657 Distance on Chessboard(搜索题)
- POJ 1657-Distance on Chessboard(BFS-多种方向不限步数)
- poj 1657 Distance on Chessboard