問題の説明:
GeoSurvComp地質調査会社は、地下の石油鉱床を検出するための責任があります。GeoSurvCompは、一度に土地の一つの大きな矩形領域で動作し、そして多数の正方形のプロットに土地を分割するグリッドを作成します。次にプロットは油が含まれているか否かを決定するために感知装置を使用して、個別に各プロットを分析します。油を含むプロットは、ポケットと呼ばれています。2つのポケットが隣接している場合、それらは同じ石油鉱床の一部です。石油鉱床は非常に大きくすることができ、多数のポケットが含まれていてもよいです。あなたの仕事は、石油鉱床がグリッドに含まれているどのように多くの異なった決定することです。
入力:
入力ファイルは、1つの以上のグリッドが含まれています。各グリッドは、mおよびnを含む行で始まり、グリッド内の行と列の数は、単一のスペースで区切られました。M = 0、入力の終了を知らせる場合。そうでない場合は、1 <= M <= 100、1 <= N <= 100この後、各m個の行n文字である(行末文字をカウントしません)。1つのプロットの各文字の対応は、とあるいずれかの `*「油の不在を表す、または` @」、オイルポケットを表します。
出力:
各グリッドのため、出力の異なる油沈着の数。T
サンプル入力:
1 1
*
3 5
* @ * @ *
** @ **
* @ * @ *
1 8
@@ **** @ *
5 5
**** @
* @@ * @
* @ ** @
@@@ * @
@@ ** @
0 0
サンプル出力:
0
1
2
2
ACコード:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a[101][101];
int m,n;
int dir[8][2]={{0,1},{0,-1},{1,0},{-1,0},
{1,1},{-1,-1},{1,-1},{-1,1}};
bool judge(int x,int y)
{
if(x>=0&&x<m&&y>=0&&y<n&&a[x][y]=='@')
return true;
return false;
}
void dfs(int x,int y)
{
if(a[x][y]=='@')
a[x][y]='*';
for(int i=0;i<8;i++)
{
int tx=x+dir[i][0];
int ty=y+dir[i][1];
if(judge(tx,ty))
dfs(tx,ty);
}
return ;
}
int main()
{
while(cin>>m>>n)
{
if(!m||!n)
break;
int ans=0;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>a[i][j];
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]=='@')
{
dfs(i,j);
ans++;
}
}
}
cout<<ans<<endl;
}
return 0;
}