UVA572原文链接
题意:
输入行列数,接下来n行m列每一个字符是‘@’或‘ * ’求@组成的联通块个数。和百练习城堡问题很像。
代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define MAXN 110
int r,c;
using namespace std;
char mp[MAXN][MAXN];
int vis[MAXN][MAXN];
void dfs(int i,int j)
{
if(vis[i][j]) return ;
vis[i][j]=1;
for(int dx=-1;dx<=1;dx++)
for(int dy=-1;dy<=1;dy++){
if(0<=i+dx&&i+dx<r&&0<=j+dy&&j+dy<c&&mp[i+dx][j+dy]=='@')
{dfs(i+dx,j+dy); }
}
}
int main()
{
while(cin>>r>>c&&r)
{
memset(vis,0,sizeof(vis));
int cnt=0;
for(int i=0;i<r;i++)
scanf("%s",mp[i]);
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
if(!vis[i][j]&&mp[i][j]=='@'){//一定要以@为起点
cnt++;
dfs(i,j);
}
cout<<cnt<<endl;
}
}
/*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
*/