얼굴 질문
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 :; } }