HDU - 1241のオイル預金(DFS)

質問が意図される:グラフに、要求ブロックの通信の数。(質問点の周囲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 ] = {{ 10 }、{ 01 }、{ - 10 }、{ 0、 - 1 }、{ 11 }、{ - 1、 - 1 }、{ - 11 }、{ 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; 
    } 
}

 

おすすめ

転載: www.cnblogs.com/Tianwell/p/11263021.html