1. 程式人生 > >POJ-1657 Distance on Chessboard

POJ-1657 Distance on Chessboard

POJ-1657 Distance on Chessboard

題目:
https://cn.vjudge.net/problem/POJ-1657

程式碼如下:

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;

int main()
{
    int n,y1,y2,a,b;
    char x1,x2;
    scanf("%d",&n);
    for(int i = 0;i < n;i++)
    {
        getchar();
        scanf("%c%d %c%d",&x1,&y1,&x2,&y2);
        a = int(x1) - 96;
        b = int(x2) - 96;
        //計算王
        if(abs(y1 - y2) < abs(a - b)) cout << abs(y1 - y2) + abs(abs(a - b) - abs(y1 - y2)) << " ";
        else cout << abs(a - b) + abs(abs(y1 - y2) - abs(a - b)) << " ";
        //計算後
        if((y1 + a) % 2 == 0)
        {
            if(y1 == y2 && a == b) cout << "0" << " ";
            else if((y2 + b) % 2 == 0 || y1 == y2 || a == b) cout << "1" << " ";
            else cout << "2" << " ";
        }
        else
        {
            if(y1 == y2 && a == b) cout << "0" << " ";
            else if((y2 + b) % 2 == 1 || y1 == y2 || a == b) cout << "1" << " ";
            else cout << "2" << " ";
        }
        //計算車
        if(y1 == y2 && a == b) cout << "0" << " ";
        else if(y1 == y2 || a == b) cout << "1" << " ";
        else cout << "2" << " ";
        //計算象
        if((y1 + a) % 2 == 0)
        {
            if(y1 == y2 && a == b) cout << "0" << endl;
            else if((y2 + b) % 2 == 0 && abs(y1 - y2) == abs(a - b)) cout << "1" << " " << endl;
            else if((y2 + b) % 2 == 0 && abs(y1 - y2) != abs(a - b)) cout << "2" << endl;
            else cout << "Inf" << endl;
        }
        else
        {
            if(y1 == y2 && a == b) cout << "0" << endl;
            else if((y2 + b) % 2 == 1 && abs(y1 - y2) == abs(a - b)) cout << "1" << " " << endl;
            else if((y2 + b) % 2 == 1 && abs(y1 - y2) != abs(a - b)) cout << "2" << endl;
            else cout << "Inf" << endl;
        }
    }
    return 0;
}

這道題要求分別計算王、後、車、象的最小步數。
對於王來說,其最小步數就是起點和終點橫縱座標絕對值之差的最大值,因為如果遇到 橫縱座標的絕對值之差不相等的時候,先需要斜走,然後在直走或者橫走。如果橫縱座標的絕對值之差相等,那麼只需要斜走就可以了。
對於後來說,需要分兩類討論,一類是起點的橫座標和縱座標的和是奇數的時候,另外一類就是起點的橫座標和縱座標的和是偶數的時候。對於前者來說,如果終點的橫座標和縱座標的和也是奇數或者起點,終點橫座標相等或者起點,終點縱座標相等,就輸出1,否則就輸出2。對於後者來說,如果終點的橫座標和縱座標的和也是偶數或者起點,終點橫座標相等或者起點,終點縱座標相等,就輸出1,否則就輸出2。
對於車來說,如果起點和終點的橫座標或者縱座標相等時就輸出1,否則就輸出2。(這很好理解,如果起點和終點的橫座標或者縱座標相等時直接橫走或者直接縱走一步到位即可,如果起點和終點的橫座標或者縱座標不等都需要先橫走再縱走或者先縱走再橫走,反正都需要2步)。
對於象來說,圖中起點和終點所在格子顏色不同時是無論如何都不能到達的,如果起點和終點格子顏色相同,如果不在一條斜線上要走2步,如果在一條直線上只需走一步。

另外,此題還有一個地方需要注意,當起點和終點位置相同時需要單獨考慮,此時王、後、車、象,最小步數都是0。(就因為這一點wa了好久…)