トピックへのリンク:http://acm.hdu.edu.cn/showproblem.php?pid=2531
溶液:ピットの主題は、2つの無実の開始時に、数Dであり、そうではない、Dの数は不明です。それでは、Dを見つけてみましょう、Dヘッドとしてそのようにして、うまく他のD Dの相対位置を記録する配列を使用して、BFSを判断します
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 CONSTの INT N = 1E3 + 7 。 チャーARR [N] [N]。 int型S1、E1、S2、E2; INTのN、M。 int型のXX、YY。 int型のマーク[N] [N]。 INT bodyx [N]。 INT bodyy [N]。 int型のPOS。 int型の D [ 4 ] [ 2 ] = { 1、0、0、1、 - 1、0、0、 - 1 }。 構造体STU { int型、B; int型の合計。 }。 int型ANS; ブール裁判官(int型のx、int型のY){ 場合(マーク[X] [Y])戻り 0 。 もし(X < 0 || Y < 0 || X> = N || Y> = M)戻り 0 ; もし(ARR [X] [Y] == ' O ')戻り 0 ; 以下のために(int型 i = 0 ; iがPOSを<; iは++ ){ int型 DX = bodyx [I] + X。 int型 DY = bodyy [i]が+Y; もし(DX < 0 || DY < 0 || DX> = N || DY> = M || DX < 0 || DY < 0 || ARR [DX] [DY] == ' O ')戻り 0 ; } リターン 1 。 } ブールジュジュ(int型のx、int型Y){ 場合(ARR [X] [Y] == ' Q ')リターン 1 。 以下のために(int型 i = 0 ; iがPOSを<; iは++ ){ int型 DX = X + bodyx [I]; int型DY = Y + bodyy [I]。 もし(ARR [DX] [DY] == ' Q ')リターン 1 。 } 戻り 0 。 } ボイド BFS(int型 X1、int型のY){ キュー <STU> QUE。 que.push({X1、Y、0 })。 マーク[X1] [Y] = 1 。 一方、(que.size()){ STU X = )(que.front。 que.pop(); もし(ジュジュ(XA、XB)){ ANS = x.sum。 ブレーク; } のために(int型 i = 0 ; iは< 4 ; iは++ ){ int型 DX = X.A + Dを[I] [ 0 ]。 int型 DY = x.b + D [i]を[ 1 ]。 もし(裁判官(DX、DY)){ que.push({DX、DY、x.sum + 1 })。 マーク[DX] [DYは] = 1 。 } } } } int型のmain(){ 一方(CIN >> N >> M){ 場合(N == 0 || Mの== 0)破ります; memsetの(マーク、0、はsizeof (商標))。 S1 = - 1 。 ANS = - 1 。 POS = 0 ; 用(int型、I = 0のscanf(; iがN <I ++)は" %sの" 、[I] ARR)。 用(int型 i = 0 ; iがN <I ++は{) のための(INT J = 0 ; J <Mであり、j ++ ){ 場合 ==(ARR [I] [J] 'D '!&& S1 = - 1 ){ bodyx [POS] = I。 bodyy [POS ++] = J; } そう であれば(ARR [I] [J] == ' D ' ){ S1 = I、E1 = J。 } } } のために(int型 i = 0 ; iはPOSを<; iは++ ){ bodyx [I] = bodyx [I] - S1。 bodyy [I] = bodyy [I] - E1。 } BFS(S1、E1)。 もし(ANS = - !1)coutの<< ANS << てendl; 他の裁判所未満<< " インポッシブル" << てendl; } 戻り 0 。 }