运用了广搜加上染色。染色:就是将不同的小组用不同的值来表现,就像染了色一样。
AC代码(c++)
#include <iostream>
#include<string.h>
using namespace std;
int vis[101][101];
char mp[101][101];
int num;
int dx[8]= {0,0,1,-1,1,-1,1,-1};
int dy[8]= {1,-1,0,0,1,1,-1,-1};
int n,m;
void bfs(int x,int y)
{
if(mp[x][y]=='*'||vis[x][y]!=0||x<0||y<0||x>=n||y>=m)
return ;
vis[x][y]=num; //赋颜色
for(int i=0; i<8; i++)
{
int tx=x+dx[i];
int ty=y+dy[i];
if(mp[tx][ty]=='@'&&vis[tx][ty]==0&&tx>=0&&tx<n&&ty>=0&&ty<m)
{
bfs(tx,ty);
}
}
}
int main()
{
while(cin>>n>>m)
{
num=0;
memset(vis,0,sizeof(vis));
if(n==0)
break;
for(int i=0; i<n; i++)
cin>>mp[i];
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
if(mp[i][j]=='@'&&vis[i][j]==0)
{
num++; //染得颜色
bfs(i,j);
}
}
}
cout<<num<<endl;
}
return 0;
}