Codeforce 370A Rook, Bishop and King 数学规律

这个题目挺有意思的,给定 起终点,要你求车,象,王分别最少要走多少步

车横竖都能走,而且每步任意走几格,所以它是最容易处理的,如果在同行或者同列,就是1,否则就是2

象要找下规律,象任意对角线都能走,而且每步任意走几格,这个时候,发现图上的黑白色块给了很大提示,如果两个本身在同一对角线,就是1,如果不在,就要判断下是否在同一色块,是就是2,否则,就走不到,输出0,至于判断是否为同一色块,非常简单,代码中给出。

其实王也是非常简单的,八个方向都能走,但是每次只能走一步,只是我好脑残,连象的规律都找出来了,偏偏王还在一步步分情况,最后发现,其实不管是在八个方向内,还是不在八个方向上,最终走的步数就是 max(fabs(x1-x2),fabs(y1-y2))..简直不想说自己。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a,b,c,d;
int maps[10][10];

int fabs(int x,int y)
{
 if (x>y) return x-y;
 else return y-x;
}

int rock()
{

    if (a==c || b==d) return 1;
    else return 2;
}
int judge (int x,int y)
{
    if ((x&1) && (y&1)) return 1;
    if (!(x&1) && !(y&1)) return 1;
    return 0;
}
int bishop()
{


    if (a-b==c-d || a+b==c+d)
        return 1;
    if (judge(a,b)==judge(c,d)) return 2;
    else return 0;

}
int king()
{
    return max(fabs(a,c),fabs(b,d));


}
int main()
{
    while (scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF)
    {
        printf("%d %d %d
",rock(),bishop(),king());
    }
    return 0;
}
原文地址:https://www.cnblogs.com/kkrisen/p/3463265.html