题目链接:https://vjudge.net/problem/UVA-572
题解:这题的问题就是求八连通块的个数(横竖或对角线方向),使用一个visit数组记录有没有访问过,然后直接dfs就可以求得结果。
代码:
#include<iostream>
#include<memory>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 100 + 10;
bool grid[maxn][maxn];
bool visit[maxn][maxn];
int cnt = 0;
int m = 0, n = 0;
void dfs(int r,int s) {
if (r < 0 || r >= m || s < 0 || s >= n)return;
if (visit[r][s] == 1 || grid[r][s] == 0)return;
visit[r][s] = 1;
for (int i = -1; i <= 1; i++)
{
for (int j = -1; j <= 1; j++) {
dfs(r + i, s + j);
}
}
}
int main() {
//freopen("input.txt","r",stdin);
while (cin >> m) {
if (m == 0)break;
cin >> n;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
char ch;
cin >> ch;
if (ch == '*')grid[i][j] = 0;
else grid[i][j] = 1;
}
}
memset(visit, 0, sizeof(visit));
cnt = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (visit[i][j] == 0 && grid[i][j] == 1) {
cnt++;
dfs(i, j);
}
}
}
cout << cnt << endl;
}
return 0;
}