あなたは水を汲み上げ、いくつかのポンプを購入する必要が効果の対象に。ポンプのポンプ容量が無限と考えることができますが、あなたは正しい場所にポンプする必要があり、町はN * Mの行列とみなすことができます。マトリックス内の各セルは「A'-」Z「小文字、小文字は、格子の高さを示しており、大きな文字は、細胞が比較的高い示し、逆に、グリッドの高さが比較的低い表します。現在のセルの水がアップ流れることができ、下、左、右グリッド、ポンプの合計数があることを?
この質問は、なぜ、検索を行うために使用することができますか?
私たちは、マップビュー*として町を見ることができますメートル **マップ、私は各グリッドの深さを知っている、と私は最も深いの1つを探しています、までしか使用することができますし、ダウンを見つけるために- N
我々は、地図のn×m個(正方形から成る)の部分の大きさ、グリッドの最大検索に変換することができます。
だから我々は完全にDFS DFSを使用して考えることはできませんが、
私たちは、このグリッドは、私は範囲のマップであることの中に、これはマークされたグリッド(つまり、渡されていない)でない場合は、[I] [J] S、状態を保持するために、配列を使用して、できる、我々は実行することができます最終出力ANSのDFS機能
その後、新しいXを決定した後、我々は最初の現在の状態を保存する関数s [i]の[j]を使用して、さらに検索DFSでは、我々は上に移動し、四方上下、新しいサイクルX、Yを保存する必要がありますそしてyは、再び私たちの配列sの範囲内で標識し、その後、現在の位置は(その場で残すために持っていることは非常に重要な)その場に残されているかどうかを判断しているかどうか、その後、我々は新しいxとyを取得する必要があり、コール、マークを行う(マークがサイクルの前に置く、クリアすることを忘れないでください)
実際には、これは再帰のようにDFSが、DFSなどがあります。。。。
この質問はとても完成されました。
バーコード
1含める<入出力ストリーム> 2含める<cstdioを> 3含める<cmath> 4 <アルゴリズム>含む 5 <CStringの>含む 6を 使用して 名前空間STDを、 7 8 のconst int型 MAXN = 53 。 9 10 INT N、M。 11 12 チャー迷路[MAXN] [MAXN]。 13の 14 CHAR S [MAXN] [MAXN]。 15 16 のint XI [] = { 0、0、 - 1、1 }。 17 18 INTの YI [] = { 1、 - 1、0、0 }。 19の 20 空隙 DFS(int型のx、int型の Y){S [X] [Y] = 1。以下のために(int型 i = 0 ; iは< 4 ; iは++ ){ 21 22 INT NX = X + XI [I]; 23 24 INT NY = Y +のYIの[I]。 25 26 であれば(NX> = 0 && NX <N && NY> = 0 && NY <M && S [NX] [NY] == 0 &&迷路[NX [NY]> = 迷路[X] [Y]){ 27 DFS(NX、NY); 28 29 } 30 31れる } 32 } // 非常に簡単な検索 33は 34である INT (メイン){ 35 36 INT T = 0 ; 37 [ 38である CIN >> T; 39 40 ながら(T- - ){ 41は 42である >> CIN >> N M、 43は 44である ため(int型 I = 0 Iは、N <; I ++は){ 45 46である CIN >> 迷路[I]; 47 48 } 49 50 のmemset(S、0、はsizeof (S))。 51 52 INT ANS = 0 。 53 54 のために(チャー C = ' ' ; C <= ' Z '、C ++ ){ 55 56 のために(int型 I = 0 ; iがNを<; Iは++ ){ 57 58 のために(INT J = 0 ; J <M。 J ++ ){ 59 60 であれば(S [I] [J] == 0 &&迷路[I] [J] == C){ 61の 62 DFS(i、j)は、 63の 64 ANS ++ ; 65 66 } 67 68 } 69 70 } 71 72 } 73 74 COUT << ANS << ENDL。 75 リターン 0 ; 76 }