您的位置:首页 > 其它

uva 657(dfs)

2014-07-26 19:32 253 查看
题解:用两个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
, k;
char str

;

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva dfs