题解:用两个dfs嵌套,先找到 * 然后开始搜索 X ,每访问到一个 X 就用 * 替换,然后把找到的 * 用 . 来替换。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 55;
int row, col, flag[3] = {-1, 0, 1}, ans[N], k;
char str[N][N];
void init() {
memset(ans, 0, sizeof(ans));
memset(str, 0, sizeof(str));
k = 0;
}
void dfs1(int x, int y) {
str[x][y] = '*';
int x0, y0;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++) {
if ((i == 0 && j == 2) || (i == 2 && j == 0) || (i == 0 && j == 0) || (i == 2 && j == 2))
continue;
x0 = x + flag[i];
y0 = y + flag[j];
if (x0 < 0 || x0 >= row || y0 < 0 || y0 >= col)
continue;
if (str[x0][y0] == 'X') {
dfs1(x0, y0);
}
}
}
void dfs(int x, int y) {
str[x][y] = '.';
int x0, y0;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++) {
if ((i == 0 && j == 2) || (i == 2 && j == 0) || (i == 2 && j == 2) || (i == 0 && j == 0))
continue;
x0 = x + flag[i];
y0 = y + flag[j];
if (x0 < 0 || x0 >= row || y0 < 0 || y0 >= col)
continue;
if (str[x0][y0] == 'X') {
dfs1(x0, y0);
ans[k]++;
}
if (str[x0][y0] == '*')
dfs(x0, y0);
}
}
int main() {
int t = 1;
while (scanf("%d%d", &col, &row) && (row || col)) {
init();
for (int i = 0; i < row; i++)
scanf("%s", str[i]);
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
if (str[i][j] == '*') {
dfs(i, j);
k++;
}
sort(ans, ans + k);
printf("Throw %d\n", t++);
for (int i = 0; i < k - 1; i++)
printf("%d ", ans[i]);
printf("%d\n\n", ans[k - 1]);
}
return 0;
}