正方形のタイルで覆われた長方形の部屋には、があります。各タイルは、赤または黒のいずれかで着色されています。男は黒いタイルの上に立っています。タイルから、彼は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 。 }