程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 棋盤上的距離,棋盤距離

棋盤上的距離,棋盤距離

編輯:C++入門知識

棋盤上的距離,棋盤距離


問題描述
國際象棋的棋盤是黑白相間的 8 * 8 的方格,棋子放在格子中間。如圖所示:

 

王、後、車、象的走子規則如下:

 王:橫、直、斜都可以走,但每步限走一格。
 後:橫、直、斜都可以走,每步格數不受限制。

 車:橫、豎均可以走,不能斜走,格數不限。

 象:只能斜走,格數不限。

寫一個程序,給定起始位置和目標位置,計算王、後、車、象從起始位置走到目標位置 所需的最少步數。 

輸入數據

第一行是測試數據的組數 t(0 <= t <= 20)。以下每行是一組測試數據,每組包括棋盤 上的兩個位置,第一個是起始位置,第二個是目標位置。位置用"字母-數字"的形式表示, 字母從"a"到"h",數字從"1"到"8"。

輸出要求

對輸入的每組測試數據,輸出王、後、車、象所需的最少步數。如果無法到達,就輸出 "Inf".

輸入樣例

2
a1 c3

f5 f8

輸出樣例

2 1 2 1

3 1 1 Inf 

解題思路:

1 先考慮特例:

   (1)何時會出新inf。易知王車後可以到達任何一點。但是象不能到達任何一點。

     可以這麼考慮,初始的象如果是白色,那麼不管其如何移動仍然會是白色。反之亦然。

         具體的數學表達為x-y的奇偶性

2 設橫向距離為x 縱向距離為y 那麼

 (1)因為王斜走一步等於先橫一步再豎一步,所以王斜走的越多越好,王斜走最多為min(x,y),為達到終點還要走|x-y|

 所以王最小的距離為 min(x,y)+|x-y|=max(x,y)

   (2)車只有橫移和豎移,所以如果在一條線上,那麼為1 否則為2

   (3)皇後 當 x=0 or y=0 一步到達 當 y=x 一步到達

       其他情況 兩步

   (4) 象 只能斜走 象每走一步,縱橫坐標增加減少相同 但是差值的奇偶性不變 所以通過此值判斷是否可以到達

        如果x=y則一步 否則兩步

c++實現:

 

#include <iostream>
using namespace std;

int main() {
    int n;
    cin>>n;

    char start[3];
    char end[3];
    for(int i=0;i<n;i++)
    {
        cin>>start>>end;

        int x=abs(start[0]-end[0]);
        int y=abs(start[1]-end[1]);
        //does not need to move
        if(x==0&&y==0)
        {
            cout<<"0 0 0 0"<<endl;
            continue;
        }
        //for king
        cout<< (x>y?x:y)<<" ";


        //for queen
        cout<<(x==0||y==0||x==y?1:2)<<" ";

        //for car
        cout<< (x==0||y==0?1:2)<<" ";

        //for ele
        if((x-y)%2==0)
        {
            if(x==y)
            {
                cout<<"1"<<endl;
            }
            else
            {
                cout<<"2"<<endl;
            }
        }
        else
        {
            cout<<"Inf"<<endl;
        }

    }

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved