Distance on Chessboard POJ - 1657(国际象棋;水题)

国际象棋的棋盘是黑白相间的8 * 8的方格,棋子放在格子中间。如下图所示:
在这里插入图片描述
王、后、车、象的走子规则如下:

王:横、直、斜都可以走,但每步限走一格。
后:横、直、斜都可以走,每步格数不受限制。
车:横、竖均可以走,不能斜走,格数不限。
象:只能斜走,格数不限。

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

思路:

初步构思可以将其中一个点位于点(0,0),另一点 横纵坐标的绝对值 即 两点横纵坐标之差的绝对值,用坐标差(均非负)解题:

王:取横纵坐标差中最大值,即所求
后:1步或2步,若两点 竖直 水平 斜 共线为1步,其余两步
车:1步或2步,若两点 竖直 水平 共线为1步,其余两步
象:1步或2步或Inf,可以发现 '象只能抵达相同颜色块',异色块'Inf'同色块斜共线1步其余2步

颜色异同转化为'坐标差奇偶性'  斜共线转换为'坐标差相等'  竖直水平共线转化为'坐标差为0'"
当然,两点重合输出 "0 0 0 0\n"

核心代码
注:int型以char型读入后 - ‘a’ 非理想值,必须用char

while(T--) { getchar();/*这个不能忘*/
        char c1, c2;//int - 'a' 不可
        int x1, y1, x2, y2, ans;
        scanf("%c%d %c%d", &c1, &y1, &c2, &y2);
        x1 = c1 - 'a' + 1; x2 = c2 - 'a' + 1;
        int m1 = abs(x1-x2);
        int m2 = abs(y1-y2);
//                           printf("%d %d %d %d\n", x1, y1, x2, y2);
        if(!m1 && !m2) {
            printf("0 0 0 0\n");
            continue;
        }

        if(m1 > m2) swap(m1, m2);//m1 < m2
//                           cout << m1 << ends << m2 << endl;
        ans = m2;
        printf("%d ", ans);

        if(!m1 || !m2 || m1 == m2) ans = 1;
        else ans = 2;
        printf("%d ", ans);

        if(!m1 || !m2) ans = 1;
        else ans = 2;
        printf("%d ", ans);

        if((m1+m2)%2) printf("Inf\n");
        else {
            if(m1 == m2) ans = 1;
            else ans = 2;
            printf("%d\n", ans);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值