POJ1657 Bailian1657 Distance on Chessboard

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

问题链接POJ1657 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, kcnt, qcnt, rcnt, bcnt;

    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)
            kcnt = qcnt = rcnt = bcnt = 0;  /*王后车象的步数*/
        else {
            kcnt= MAX(dx, dy);
            qcnt = (dx == dy || dx == 0 || dy == 0) ? 1 : 2;
            rcnt = (dx == 0 || dy == 0) ? 1 : 2;
            if(dx == dy)
                bcnt = 1;
            else if(abs(dx - dy) % 2 != 0)
                bcnt = -1;
            else
                bcnt = 2;
        }

        printf("%d %d %d ", kcnt, qcnt, rcnt);
        if(bcnt == -1)
            printf("Inf\n");
        else
            printf("%d\n", bcnt);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/tigerisland45/article/details/83999709