POJ1164-The Castle

18 篇文章 0 订阅

深度优先搜索时,将问题的各状态之间的转移关系描述为一个图,则深度优先搜索遍历整个图的框架为:

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值