UVa810

この質問はあなたがして、よりよい解決策を考え出す表は良いことですヒットすることができない場合は、何も言う必要はありません!

// UVA 810 
の#include <cstdioを> 
する#include <iostreamの> 
の#include <CStringの>  
の#include < 文字列 >  
の#include <ベクトル>  
の#include < 設定 > 
 使用して 名前空間はstd; 

CONSTの INT MAXN = 10 + 5 

int型の PIC [ 7 ] [ 7 ]。

ボイドのinit(){ 
    PIC [ 1 ] [ 2 ] = 4PIC [ 1 ] [ 3 ] = 2PIC [1 ] [ 4 ] = 5PIC [ 1 ] [ 5 ] = 3 
    PIC [ 2 ] [ 1 ] = 3 ; PIC [ 2 ] [ 3 ] = 6PIC [ 2 ] [ 4 ] = 1PIC [ 2 ] [ 6 ] = 4 
    PIC [ 3 ] [ 1 ] = 5PIC [ 3 ] [ 2 ] = 1PIC [ 3 ] [ 5 ] = 6; PIC [ 3 ] [ 6 ] = 2 
    PIC [ 4 ] [ 1 ] = 2 ; PIC [ 4 ] [ 2 ] = 6PIC [ 4 ] [ 5 ] = 1PIC [ 4 ] [ 6 ] = 5 
    PIC [ 5 ] [ 1 ] = 4PIC [ 5 ] [ 3 ] = 1PIC [ 5 ] [ 4 ] = 6PIC [ 5 ] [ 6 ] =3 ; 
    PIC [ 6 ] [ 2 ] = 3 ; PIC [ 6 ] [ 3 ] = 5PIC [ 6 ] [ 4 ] = 2PIC [ 6 ] [ 5 ] = 4 
} 

int型、M、A、B、T、F、N。
INT G [MAXN] [MAXN]。

構造体ノード{
   int型のX、Y、上面、顔、ルート。  
  ノード(INT X = 0INT = Y 0INTトップ= 0INT顔= 0int型のルート= 0 ):
    X(X)、Y(y)は、上部(トップ)、顔(顔)、根(ルート){} 
  ブール 演算子 <(ノードB)のconst {
     もし!(X = BX)を返す X < BX。
    もし(!Y =で)返す <yとすることにより、
    もし(トップ= b.top!)リターントップ< b.top。
    返す顔を< b.face。  
  } 
  BOOL isVis()のconst {
     リターン X> = 1 && X <= N && Y> = 1&& Y <= M && G [X] [Y] =!0 
  } 
}。

int型のCNT;
セット <ノード> 設定します。
ベクトル <ノード> アンス。

ボイド findnode(ノードU、INT REM){
   int型のX1、Y1、T、F、L。
  X1 = UX; Y1 = UY。トン= u.top。F = u.face。      
  L = PIC [T] [F]。
  ノードA1(X1、Y1 - 17 - L、F、REM)。
  もし!(a1.isVis()&& Set.count(A1)&&(G [X1] [Y1- 1 - ] == 1 || G [X1] [Y1- 1 ] == T)){
    Set.insert(A1)。
    Ans.push_back(A1)。
  } 
  ノードA2(X1、Y1 + 1 、L、F、REM)。 
  もし(!a2.isVis()&& Set.count(A2)&&(G [X1] [Y1 + 1 ] == - 1 || G [X1] [Y1 + 1 ] == T)){ 
    Set.insert(A2 ); 
    Ans.push_back(A2)。     
  } 
  ノードA3(X1 - 1、Y1、F、7 - T、REM)。 
  もし(!a3.isVis()&& Set.count(A3)&&(G [X1- 1 ] [Y1] == - 1 || G [X1- 1 ] [Y1] == T)){ 
    Set.insert (A3)。 
  ノードA4(X1
    Ans.push_back(A3)。     
  }+ 1、Y 1、7 - F、T、REM)。
  もし(!a4.isVis()&& Set.count(A4)&&(G [X1 + 1 ] [Y1] == - 1 || G [X1 + 1 ] [Y1] == T)){ 
    Set.insert(A4 ); 
    Ans.push_back(A4)。    
  } 
} 

BOOL BFS(){     
  ノードV(A、B、T、F、 - 1 )。
  Ans.push_back(V); 
  一方(CNT < Ans.size()){ 
    ノードU =回答[CNT ++ ]。 
//     coutの<< UX << "" << UY << "" << u.top << "" << u.face <<てendl;
    (UX == A && UY == B && CNT- を返す 
    findnode(U、CNT - 1 )。
  } 
  を返す 
} 

int型の数、フラグ。

ボイド DG(int型NUM){
   場合(ANSは[NUM] .root =! - 1 )DG(ANS [NUM] .root)。
  ++ 数えます。
  カウント%= 10 ; 
  もし(フラグ)
    のprintf(" " )。
  他の{ 
    のprintf(" " ); 
    フラグ =  1 ; 
  } 
  であれば(==カウント0 ){ 
    のprintf(" の\ n " ); 
    printf("   " ); 
    カウント = 1 ; 
  } 
  のprintf(" (%dを、%のD)" 、アンス[NUM] .X、アンス[NUM] .Y)。     
} 

int型のmain(){ 
  INIT()。
  文字列strの。
  しばらく(CIN >> STR && STR =!" END " ){ 
    coutの << STR << " \ nを" ; 
    CIN >> N >> M >> A >> B> > T >> F;  
    にとってint型 I = 1 ; ++; iが<= N I)
       のためにINT J = 1 ; J <= M; ++ j)は
        、CIN >> G [I] [J]。
    CNT = 0 ; 
    Set.clear(); 
    Ans.clear(); 
    もし(BFS()){ 
      カウント =フラグ= 0 
      DG(CNT - 1 )。
      printf(" \ nを" ); 
    } 
    他の 
      printf関数( "  N \可能な解決策ありません" ); 
  } 
  の戻り 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/yifeiWa/p/10981419.html