uva 657(dfs)

来源:互联网 发布:上瘾网络剧韩国粉丝 编辑:程序博客网 时间:2024/06/05 00:11

题解:用两个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;}


0 0