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\n") ;

            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

 

你可能感兴趣的:(OO)