H - 騎士はDFSを移動

あなたの友人はあなたが一度だけチェス盤の上に、n個の正方形の与えられた集合の各正方形を訪れ騎士の移動の最短閉じツアーを見つけることです旅行の騎士問題(TKP)の研究を行っています。彼は問題の最も難しい部分は、与えられた二つの正方形の間に、あなたはこれを達成した後、ツアーを見つけることは簡単だろう、その騎士の動きの最小数を決定していると思います。 
もちろん、それはその逆であることを知っています。だから、「難しい」の部分を解決してプログラムを書くために彼を提供します。 

あなたの仕事は、入力として2つの正方形AおよびBを取り、その後、AからBへの最短経路上の騎士移動の数を決定するプログラムを作成することです。 

InputThe入力ファイルは、1つまたは複数のテストケースが含まれています。各テストケースは、一つのスペースで区切られた2つの正方形を含むもの行から成ります。正方形は、列及びチェスボード上の行を表す数字(1-8)を表す文字(AH)からなる文字列です。 
OutputFor各テストケース、言っ印刷一行「XXからYYに取得するには、n個の騎士の動きをとります。」。 
サンプル入力

E4 E2 
A1 B2 
B2 C3 
A1 H8 
A1 H7 
、H8、A1 
、B1、C3 
F6 F6

サンプル出力

E4にE2から取得するには、2つの騎士の動きをとります。
B2にA1から取得するには、4つの騎士の動きをとります。
C3に2つの騎士の動きを取るB2を取得します。
A1からH8を取得するには、6つの騎士の動きをとります。
A1からH7を取得するには、5つの騎士の動きをとります。
A1にH8から取得するには、6つの騎士の動きをとります。
C3にB1から取得するには、1つの騎士の動きをとります。
F6にF6から取得するには、0騎士の動きをとります。

アイデア:騎士のみ、各動きが実際にある1平方日本語の単語(私は特定の理由を知りません)8方向に移動することができ,,見て直接にBFS

書式#include <iostreamの> 
の#include <キュー>  
の#include < 文字列 > 
の#include <CStringの>
 使用して 名前空間はstd;
構造体STU {
     int型、B。
}。
char型、Bと、
int型AA、BB;
int型 ARR [ 10 ] [ 10 ]。
INT ARR1 [ 10 ] [ 10 ]。
INT ARR2 [ 10 ] [ 10 ]。
INT AR [ 8 ] [ 2 ] = {{ - 2、 - 1 }、{ -21 }、{ 21 }、{ 2、 - 1 }、{ 12 }、{ 1、 - 2 }、{ - 12 }、{ - 1、 - 2 }}。
INT BFS(INT X1、INT Y1、INT X2、INT Y2){ 
    memsetの(ARR1、0はsizeof (ARR1))。
    キュー <STU> QUE。
    que.push({X1、Y1})。
    ARR1 [X1] [Y1] = 1  
    ARR2 [X1] [Y1] = 0 ;
    一方、(que.size()){
         int型のx = que.front()。
        INT Y = que.front()B。
        que.pop(); 
        int型のDX、DY。 
        以下のためにint型 i = 0 ; iは< 8 ; iは++ 
        { 
            DX = X + AR [i]が[ 0 ]。
            DY = Y + AR [i]は、[ 1 ]。
            もし(DX> = 0 && DX < 8 &&のDY> = 0 &&のDY < 8 && ARR1 [DX] [DY]!= 1){ 
                ARR1 [DX] [DYは] = 1 
                ARR2は、[DX] [DY] = ARR2 [X] [Y] + 1 
                que.push({DX、DY})。
                もし(DX == X2 && DY == Y2){
                     戻り[DX] [DY] ARR2。
                } 
            } 
        } 
    } 
    リターン - 1 
} 
int型のmain()
{ 
    ながら(〜のscanf(" %のC%dの%Cは%のD "、&​​、&AA、&B、&BB)){ 
        GETCHAR()。
        以下のためにint型 = Iを0 ;私は<8; iは++ 
        { 
            ためint型 J = 0 ; J < 8 ; J ++ 
            { 
                ARR [I] [J] = 1 
            } 
        } 
        int型 X1 = A- ' A ' //         coutの<< X1 <<てendl; 
        int型 Y1 = AA- 1 //         coutの<< Y1 <<てendl; 
        int型 ×2 = B- ' A ' ;
//         coutの<< X2 <<てendl; 
        int型 Y2 = BB- 1 //        coutの<< Y2 <<てendl; 
        ARR [X1] [AA- 1 ] = 0 ; 
        ARR [X2] [BB - 1 ] = 0 ;
        もし(X1 ==×2 && y1は== Y2)
            のprintf(" %Cは%dに%Cは%dから取得するには、0騎士の動きをとる\ nは。" 、AA、B、BB);
        {
             INT Y =のBFS(X1、Y1、X2、Y2)。
            printf(" %Cは%dに%Cは%dから取得するには、%Dナイトの動きをとる\ N。" 、A-A、B、BB、y)を、
        } 
    } 
    
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/Accepting/p/11241602.html
h'h