一、题意:有三种水果分别用,'@','*','#'三种符号表示,上下左右相连的同种水果被看做是一个区域,问一共有多少个区域
二、思路:用dfs去标记相连区域,然后遍历每个没有被标记的位置进行dfs
三、代码:
#include"iostream"
#include"stdio.h"
#include"vector"
using namespace std;
const int MAXN=105;
char farm[MAXN][MAXN];
int m,n,cnt;
bool IsEdge(int x,int y)
{
if(x>=0&&x<m&&y>=0&&y<n)
return true;
return false;
}
bool IsSame(int x,int y,char tree)
{
if(farm[x][y]==tree)
return true;
return false;
}
void Dfs(int x,int y,char tree)
{
int dir[]={0,1,0,-1,-1,0,1,0};
for(int i=0;i<8;i+=2)
{
int dx=x+dir[i];
int dy=y+dir[i+1];
if(IsEdge(dx,dy)&&IsSame(dx,dy,tree))
{
farm[dx][dy]='-';
Dfs(dx,dy,tree);
}
}
}
int main()
{
while(cin>>m>>n,m&&n)
{
for(int i=0;i<m;i++)
{
cin>>farm[i];
}
cnt=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(farm[i][j]!='-')
{
cnt++;
char tree=farm[i][j];
farm[i][j]='-';
Dfs(i,j,tree);
}
}
}
cout<<cnt<<endl;
}
return 0;
}