深度优先搜索时,将问题的各状态之间的转移关系描述为一个图,则深度优先搜索遍历整个图的框架为:
Dfs(V)
{
if (v访问过) {
return;
}
将v标记为访问过;
对和v相邻的每个点u:Dfs(u);
}
int main()
{
while (在图中能找到未访问过的点k) {
Dfs(k);
}
}
种子填充法。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int map[55][55];
int vst[55][55];
int rnum = 0;
int rarea = 0;
void Dfs(int r, int c)
{
if (vst[r][c]) {
return;
}
vst[r][c] = rnum;
rarea++;
if ((map[r][c] & 1) == 0) {
Dfs(r, c-1);
}
if ((map[r][c] & 2) == 0) {
Dfs(r-1, c);
}
if ((map[r][c] & 4) == 0) {
Dfs(r, c+1);
}
if ((map[r][c] & 8) == 0) {
Dfs(r+1, c);
}
}
int main()
{
int row, col;
scanf("%d%d", &row, &col);
int i, j;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
scanf("%d", &map[i][j]);
}
}
int mrarea = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (!vst[i][j]) {
rnum++;
rarea = 0;
Dfs(i, j);
}
mrarea = max(mrarea, rarea);
}
}
printf("%d\n", rnum);
printf("%d\n", mrarea);
return 0;
}