POJ1657 Bailian1657 Distance on Chessboard
Posted tigerisland45
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ1657 Bailian1657 Distance on Chessboard相关的知识,希望对你有一定的参考价值。
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 [email protected]
问题链接:Bailian1657 Distance on Chessboard
问题描述:(略)
问题分析:
????这个问题是给出棋盘上的起始位置,分别计算王后车象从起始位置到达终止位置所需的步数。可以先算出横向坐标的差值dx和纵向坐标的差值dy。起止位置相同时,只需要走0步。
????分别考虑王后车象的行走规则,王可以直走、横走和邪走,所以所需要走的步数为dx和dy中较大的;后可以八个方向行走,所以处在同行、同列和同一邪线上则走1步就到目标位置,否则走2步即可;车可以横走也可以竖走,如果在同一行或同一列上则走1步就到目标位置,否则走2步就可以到目标位置;象是走邪线,有黑象和白象之分,如果在同一邪线上则1步可到目标位置,如果在同一颜色的邪线上最多2步可以到达目标位置,否则就不可到达目标位置。
+程序说明:
????数组ans[]的元素分别用于存储王后车象的步数。计算与输出逻辑分开。
参考链接:(略)
题记:(略)
AC的C语言程序如下:
/* POJ1657 Bailian1657 Distance on Chessboard */
#include <stdio.h>
#include <stdlib.h>
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define N 4
int main(void)
{
int t, ans[N];
scanf("%d", &t);
while(t--) {
char start[3], end[3];
scanf("%s%s", start, end);
int dx = abs(end[0] - start[0]);
int dy = abs(end[1] - start[1]);
if(dx == 0 && dy == 0)
ans[0] = ans[1] = ans[2] = ans[3] = 0; /*王后车象的步数*/
else {
ans[0] = MAX(dx, dy);
ans[1] = (dx == dy || dx == 0 || dy == 0) ? 1 : 2;
ans[2] = (dx == 0 || dy == 0) ? 1 : 2;
if(dx == dy)
ans[3] = 1;
else if(abs(dx - dy) % 2 != 0)
ans[3] = -1;
else
ans[3] = 2;
}
printf("%d %d %d ", ans[0], ans[1], ans[2]);
if(ans[3] == -1)
printf("Inf
");
else
printf("%d
", ans[3]);
}
return 0;
}
以上是关于POJ1657 Bailian1657 Distance on Chessboard的主要内容,如果未能解决你的问题,请参考以下文章
[BZOJ] 1657: [Usaco2006 Mar]Mooo 奶牛的歌声
[BZOJ1657][Usaco2006 Mar]Mooo 奶牛的歌声