码迷,mamicode.com
首页 > 其他好文 > 详细

POJ1657 Bailian1657 Distance on Chessboard

时间:2018-11-13 03:02:45      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:void   说明   链接   href   否则   颜色   方向   ble   程序   

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

问题链接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\n");
        else
            printf("%d\n", ans[3]);
    }

    return 0;
}

POJ1657 Bailian1657 Distance on Chessboard

标签:void   说明   链接   href   否则   颜色   方向   ble   程序   

原文地址:https://www.cnblogs.com/tigerisland45/p/9949631.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!