C - DFS / BFS POJH - 1979

C - DFS / BFS

POJ - 1979

正方形のタイルで覆われた長方形の部屋には、があります。各タイルは、赤または黒のいずれかで着色されています。男は黒いタイルの上に立っています。タイルから、彼は4枚の隣接するタイルの1つに移動することができます。しかし、彼は、彼は黒いタイルの上にのみ移動することができ、赤瓦の上に移動することはできません。

彼は、上述の移動を繰り返すことで到達することができ、黒のタイルの数をカウントするプログラムを書きます。

入力

入力は複数のデータセットから成ります。データ・セットは、 W及びH 2つの正の整数を含む行から始まります。WおよびHは、タイルの数であるにおいて、それぞれx方向及びy方向。WとH以上ではありません20 

H複数のラインが存在するデータセット W文字を含む各々は、。各文字は、タイルの色を表しているように従います。

"  -黒のタイル -赤いタイル@ " -黒のタイル上の男が(正確に一度出現してデータセット)の入力端はれる二つのゼロからなる線で示します。

 

出力

各データについてセット、あなたのプログラムは、彼が達することができるタイルの数含まれているライン出力をすべきであるから、最初のタイルを(自身を含みます)。

 

サンプル入力

6  9 
....#。
.....#
...... 
...... 
...... 
...... 
...... 
#@ ...# 
。#..#。
11  9 
。#......... 
。#。#######。
。#。#.....#。
。#。#。###。#。
。#。#.. @#。#。
。#。#####。#。
。#.......#。
。#########。
........... 
11  6 
..#..##.. .. 
..#..##.. .. 
..#..#.. ### 
..#。 。#..#@。
..#..#..#.. 
..#..#..#.. 
7  7 
..#。#.. 
..#。#.. 
###。### 
... @。 ... 
###。### 
..#。#.. 
..#。#.. 
0  0

 

サンプル出力

45 
59 
6 
13

 

件名の説明:

@オフィス、はいタイルからの人。上下に行くことができ、あなたは#さんに行くことはできません。タイルの破片が行くことができますどのように多くの彼の活動の範囲内で尋ねました。(すなわち、点の数である#で囲まれた場所、レンガの何個の合計です。)

分析:

仕上がりの要件は、より便利に、DFSで、迷路。限り座標が再帰の使用の始まりとなったように、各再帰的ステップは、時間がかかり、結果に1を追加することです。そのようなマップとして、終了条件を設定するか、#の終わりを越えて行くことができます。

コード:

する#include <stdio.hの> 
 CHAR [ 30 ] [ 30 ]。
int型N、M。
int型のres;
INT DFS(INT Y、INT X)
{    
    場合(Y < 0 || Y> M- 1 || X < 0 || X> N- 1戻り 0 ;
    もし([Y] [X] == ' '戻り 0 ; 
    [Y] [X] = ' G ' 
    解像度 ++ ;
    以下のためのint型DX = - 1 ; DX <= 1 ; DX ++ 
    { 
        int型 NX = X + DX。
        もし([Y] [NX] == ' ' 
        { 
            DFS(Y、NX)。
        } 
    } のためのINT DY = - 1 ; DY <= 1 ; DY ++ 
    { int型 NY = Y + DY。
        もし([NY] [X] == ' ' 
        { 
            DFS(NY、X)。
        } 
    } 戻り0 
    
        
     
    
}
INT メイン()
{    
    ながら1 
    { 
        RES = 0 int型P、Q; 
        scanf関数(" %D%D "、&​​N、&M)。
        もし(N == 0 && M == 0ブレーク
        getchar(); 
        以下のためにINT iが= 0 ; I <Mを、I ++ 
        { 
            ためINT J = 0 ; J <N; J ++ 
            { 
                [I] [J] =getchar();
                もし([I] [J] == ' @ ' 
                { 
                    P = I。
                    Q = J; 
                } 
            } 
            GETCHAR()。
        } 
        DFS(P、Q)。
        printf(" %dの\ n " 、RES)。
    } 
    戻り 0 
}

 

 

おすすめ

転載: www.cnblogs.com/studyshare777/p/12185454.html