最基础最常见的深搜。
#include <cstdio>
#include <cstring>
const int MAX = 100;
char deposit[MAX+2][MAX+2];
bool visit[MAX+2][MAX+2];
int readchar()
{
int t;
while (t = getchar())
{
if (t == '*' || t== '@') break;
}
return t;
}
void read_map(int n, int m)
{
for (int i = 1; i <= n; i++)
{
deposit[i][1] = readchar();
for (int j = 2; j <= m; j++) deposit[i][j] = getchar();
}
}
const int ROW[] = {-1, -1, 0, 1, 1, 1, 0, -1};
const int COL[] = {0, 1, 1, 1, 0, -1, -1, -1};
void explore(int r, int c)
{
visit[r][c] = true;
for (int i = 0; i < 8; i++)
{
int nr = r + ROW[i];
int nc = c + COL[i];
if (deposit[nr][nc] == '@' && !visit[nr][nc]) explore(nr, nc);
}
}
void parts_count(int n, int m, int &ans)
{
ans = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
if (deposit[i][j] == '@' && !visit[i][j])
{
ans++;
explore(i, j);
}
}
}
int main()
{
int n, m;
while (scanf("%d%d", &n, &m) && m)
{
// init
memset(deposit, 0, sizeof(deposit));
memset(visit, 0, sizeof(visit));
// input
read_map(n, m);
// count
int ans;
parts_count(n, m, ans);
// print
printf("%d\n", ans);
}
return 0;
}