[] 화용 NOIP2013

얼굴 질문

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

문제 해결

$ BFS $

사용법 #include <iostream> 
#INCLUDE <cstdio> 
#INCLUDE <CString을>
 사용  스페이스 성병; 

CONST의  INT의 DX [] = { 1 , 0 , - 1 , 0 }, DY [] = { 0 , 1 , 0 , - 1 };
INT의 F [ 35 ] [ 35 ] [ 35 ] [ 35 ], 맵 [ 35 ] [ 35 ];
INT의 N, M, Q; 

인라인 INT의 절대치 ( INT의 X) {
   경우 (x> 0) 리턴 X; 다른  반환 - X; 
} 

구조체 노드 {
   INT의 TOX, 장난감, EMX, emy 단계; 
케} [ 1000000 ]; 

인라인 BOOL는 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, 텍사스, 타이, 전, 도망, 꼬리, 머리, 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; 내가 ++ ) { 
    는 scanf ( " % D % D % D % D % D % D " , 및 전, EY, SX, SY, TX, TY);
    (SX == TX && SY == TY) { 
      둔다 ( " 0 " );
      고토 L1; 
    } 
    케 [ 1 ] = (노드) {SX, SY, 전, EY, 0 }; 
    F [SX [SY] [예] [EY] = I; 
    꼬리 = 1 ; 헤드 = 1 ;
    반면 (헤드 <= 꼬리) { 
      ex0 = 케 [헤드] .emx; ey0 = 케 [헤드] .emy; 
      X0 = 케 [헤드] .tox; Y0 = 케 [헤드] .toy;
      경우 (ABS (ex0-X0) + ABS (ey0-Y0) == 1 && F [ex0] ey0 [X0 [Y0] < ⅰ) {
         만약(ex0 == TX && ey0 == TY) { 
          의 printf ( " % D \ 없음 " , 케 [헤드] .step + 1 );
          고토 L1; 
        } 
        케 [ ++ 꼬리] = (노드) {ex0, ey0, X0, Y0, 케 [헤드] .step + 1 }; 
        F [ex0] ey0 [X0 [Y0] = I; 
      } 
      에 대한 (j = 0 ; J <= 3 , J ++) 경우 (CAN (I, X0, Y0, ex0 + DX [J], ey0 + DY [J])) { 
        케 [ ++ 꼬리] = (노드) { X0, Y0, ex0 + DX [J], DY에 ey0 + [J], 케 [헤드] .step + 1 }; 
        F [X0 [Y0] ex0 + DX [J] [ey0 + DY [J]] = I; 
      }
      머리++ ; 
    } 
    둔다 ( " -1 " ); 
    L1 :; 
  } 
}

 

추천

출처www.cnblogs.com/shxnb666/p/11277911.html