フェイス質問
https://www.luogu.org/problem/P1979
問題の解決策
$ BFS $
書式#include <iostreamの> の#include <cstdioを> する#include <CStringの> 使用して 名前空間はstd; 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型 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 :; } }