题目大意:一个nxm的字母矩阵只包含“@‘和’*‘,求有多少个@块(八个方向相连为一个@块)
解题思路:对每个@出现的地方进行深搜,将其周围满足条件的都替换成’*‘,直到矩阵中没有@,深搜了几次说明有几个@块
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <string>
#include <queue>
#include <vector>
#include <list>
#include <stack>
#include <map>
#include <set>
using namespace std;
const int maxn = 100+10;
const int dir[8][2] = {{-1,0},{1,0},{0,1},{0,-1},{-1,1},{-1,-1},{1,-1},{1,1}};
char s[maxn][maxn];
int m,n;
void dfs(int x,int y)
{
s[x][y] = '*';
for(int i = 0; i < 8; i++)
{
int xx = x+dir[i][0];
int yy = y+dir[i][1];
if(xx>=0 && xx<m && y>=0 && yy<n && s[xx][yy] == '@')
dfs(xx,yy);
}
}
int main()
{
while(scanf("%d%d",&m,&n) != EOF)
{
if(!(n+m)) break;
getchar();
for(int i = 0; i < m; i++)
gets(s[i]);
int ans = 0;
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
if(s[i][j] == '@')
{
dfs(i,j);
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}