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; }