[]華容NOIP2013

フェイス質問

https://www.luogu.org/problem/P1979

問題の解決策

$ BFS $

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <CStringの>
 使用して 名前空間はstd; 

CONSTの INT DX [] = { 10、 - 10 }、DY [] = { 010、 - 1 }。
int型の F [ 35 ] [ 35 ] [ 35 ] [ 35 ]、マップ[ 35 ] [ 35 ]。
INTのN、M、Q。

インラインint型 ABS(INT X){
   場合(X> 0リターン X。他の リターン - X; 
} 

構造体ノード{
   int型TOX、玩具、EMX、EMY、ステップと 
} QUE [ 1000000 ]。

インラインブール値(CAN int型 CUR、int型のx、int型の Y、INT X2、INT Y2){
   場合(X2 == X && Y2の==のY)を返す もし(X2> = 1つの && X2 <= N && Y2> = 1 && Y2 <= M &&マップ[X2] [Y2] && F [X] [Y] [X2] [Y2 <CUR)を返す 他の リターン ; 
} 

int型のmain(){ 
  レジスタint型、I jは、
  登録int型SX、SY、TX、TY、EX、EY、尾を、頭部、EX0、ey0、X0、Y0; 
  scanf関数(" %D%D%D "、&​​N、&M&Q)。
  (i = 1 ; iが<= N; iは++ のために(J = 1 ; J <= Mであり、j ++)のscanf(" %dの"、&マップ[I] [J])。
  (i = 1 ; iが<= Q; iは++ ){ 
    scanf関数(" %D%D%D%D%D%D "、&​​EX、&EY、およびSX、&SY、&TX、&TY)。
    (SX == TX && SY == TY){ 
      プット(" 0 " )。
      後藤L1; 
    } 
    QUE [ 1 ] =(ノード){SX、SY、EX、EY、0 }。
    F [SX] [SY] [EX] [EY] = I。 = 1 ; ヘッド= 1 一方、(ヘッド<= 尾){ 
      EX0 = QUE [頭部] .emx。ey0 = QUE [頭部] .emy。
      X0 = QUE [頭部] .tox。Y0 = QUE [頭部] .toy。
      もし(ABS(EX0-X0)+ ABS(ey0-Y0)== 1 && F [EX0] [ey0] [X0] [Y0] < I){
         もし(EX0 == TX && ey0 == TY){ 
          のprintf(" %d個の\ n "、QUE [ヘッド]。ステップ+ 1 )。
          後藤L1; 
        } 
        QUE [ ++尾] =(ノード){EX0、ey0、X0、Y0、QUE [ヘッド]。ステップ+ 1 }。
        F [EX0] [ey0] [X0] [Y0] = I。
      } 
      ため(J = 0 ; J <= 3 ; J ++)場合(CAN(I、X0、Y0、EX0 + DX [J]、ey0 + DY [J])){ 
        QUE [ ++尾] =(ノード){ X0、Y0、EX0 + DX [J]、ey0 + DYの[J]、QUE [ヘッド]。ステップ+ 1 }。
        F [X0] [Y0] [EX0 + DX [J] [ey0 + DY [J] = I。
      }
      ヘッド ++ ; 
    } 
    プット(" -1 " )。
    L1 :; 
  } 
}

 

おすすめ

転載: www.cnblogs.com/shxnb666/p/11277911.html