CF Rook, Bishop and King

http://codeforces.com/contest/370/problem/A

题意:车是走直线的,可以走任意多个格子,象是走对角线的,也可以走任意多个格子,而国王可以走直线也可以走对角线,但是每次只能走一个格子。

思路:这个题的车和国王不难理解,车是如果两个点在同一列或者同一行上那么走一步即可到达,剩下的走两步都可到达。国王是走两个点的行和列的差值的最大值,也就是说king=max(fabs(r1-r2),fabs(c1-c2));表示我一直错在象上,错了六遍。。。。竟然还没掉rating,,,,不科学。看那个棋盘,若是两个点在同一对角线上那么走一步就能到,也就是说,如果fabs(r1-r2)= fabs(c1-c2),那就走一步,但是如果不在同一对角线上,可以走两步到,前提是,两个点都是黑的或都是白的。。。。。。

#include <iostream>
#include <stdio.h>
#include <cmath>

using namespace std;

int main()
{
    int r1,c1,r2,c2 ;
    while(~scanf("%d %d %d %d",&r1,&c1,&r2,&c2))
    {
        int rook = 0,bishop = 0,king = 0 ;
        if(r1 == r2&&c1==c2)
        {
            printf("0 0 0
") ;
            continue ;
        }
        if(r1 == r2||c1 == c2)
            rook = 1 ;
        else rook = 2 ;
        if(fabs(r1-r2) == fabs(c1-c2))
            bishop = 1 ;
        else if((r1+c1)%2 == (r2+c2)%2)
        bishop = 2 ;
        else bishop = 0 ;
        king = max(fabs(r1-r2),fabs(c1-c2)) ;
        cout<<rook<<' '<<bishop<<' '<<king<<endl ;
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3463026.html