質問が意図される:グラフに、要求ブロックの通信の数。(質問点の周囲8点とが接続されている領域)
アイデア:この質問は非常に基本的な検索染色(回数)であるが、私はBFSで始まるが、MLEを持っているので、彼らはより少ないスペースを消費DFSを使用します
完全なコード:
書式#include <iostreamの> の#include <CStringの> の#include <cmath> の#include <キュー> の#include <スタック> 使用して 名前空間はstd; const int型 MAXN = 101 ; INTのN、M。 チャーマップ[MAXN] [MAXN]。 int型VIS [MAXN] [MAXN]。 INT MOV [] [ 2 ] = {{ 1、0 }、{ 0、1 }、{ - 1、0 }、{ 0、 - 1 }、{ 1、1 }、{ - 1、 - 1 }、{ - 1、1 }、{ 1、 - 1 }}; 構造体ノード{ int型のX、Y; }; ボイドDFS(ノードS) { IF(MAP [SX] [SY] == ' #' || VIS [SX] [SY] =!0 || SX < 1。 || SY < 1。 || SX> SY N- ||> M)// 条件が成立戻りない リターン; VIS [SX] [SY] = 1 ; // 染色 のために(INT I = 0 ;私は< 8 ; I ++)//判断往哪走 { ノードT。 TX = s.x + MOV [I] [ 0 ]。 TY = s.y + MOV [I] [ 1 ]。 もし(地図[TX] [TY] == ' @ ' && VIS [TX] [TY] == 0 && t.x> 0 && t.x <= N && t.y> 0 && t.y <= M) { DFS(T ); } } } // 空隙BFS(ノードS){ // BFS中キュー开的空间太大 // キュー<ノード> Q。 // Q.push(S); // 一方(Q.size()){ // ノードT = Q.front()。 // VIS [TX] [TY] = 1。// 访问 // Q.pop(); // のために(0 = I int型、iは8 <; iは++){ // ノードNEXと、 // nex.x = t.x + MOV [I] [0]。 // nex.y = t.y + MOV [I] [1]。 // (nex.x <1 || nex.y <1 || nex.x> N || nex.y> m)が続けば、// 边界条件 // それ以外の場合(VIS [nex.x] [nex.y] ||(マップ[nex.x] [nex.y] == '*'))続けます。 // 他{ // Q.push(NEX)。 // } // } // } //は} int型getblocks(){ int型 CNT = 0 。 以下のために(int型 I = 1、I ++; = n iは< ) のために(INT J = 1 ; J <= Mであり、j ++ ){ もし!(VIS [I] [J] &&(マップ[I] [J] == ' @ ' )){ CNT ++ ; ノードs。 SX = I、SY = J; DFS(S); } } 戻りCNT。 } INT (){主 ながら(CIN >> N >> M){ チャー、CH memsetの(VIS、0、はsizeof (VIS))。 もし(N == 0 && m個の== 0)ブレーク。 以下のために(int型 I = 1は iが++; iがn = < ) のための(INT J = 1 ; J <= Mであり、j ++ ){ CIN >> CH。 地図[I] [J] = CH。 } INT ANS = getblocks()。 coutの<< ANS << てendl; } }