N - 城堡问题

N - 城堡问题

题目:
https://cn.vjudge.net/contest/271046#problem/N

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define MAX 55

int a[MAX][MAX],vis[MAX][MAX],sum = 0,max_size = 0;

void dfs(int i,int j)
{
    if(vis[i][j]) return;
    vis[i][j] = 1;//把走过的点设置为旧点;
    max_size++;
    if((a[i][j] & 1) == 0) dfs(i,j - 1);//往西走
    if((a[i][j] & 2) == 0) dfs(i - 1,j);//往北走
    if((a[i][j] & 4) == 0) dfs(i,j + 1);//往东走
    if((a[i][j] & 8) == 0) dfs(i + 1,j);//往南走
}

int main()
{
    int n,m,MAXSIZE = 0;
    scanf("%d%d",&n,&m);
    for(int i = 0;i < n;i++)
    {
        for(int j = 0;j < m;j++) scanf("%d",&a[i][j]);
    }
    memset(vis,0,sizeof(vis));//起初全部设置为新点

    for(int i = 0;i < n;i++)
    {
        for(int j = 0;j < m;j++)
        {
            if(!vis[i][j])
            {
                max_size = 0;//遇到新的房间时先把面积设置为0
                sum++;//累加城堡的房间数
                dfs(i,j);
                MAXSIZE = max(MAXSIZE,max_size);
            }
        }
    }
    cout << sum << endl;
    cout << MAXSIZE << endl;
    return 0;
}

这是一道DFS题,把方块看作是节点,相邻两个方块之间如果没有墙,则在方块之间连一条边,这样城堡就能转换成一个图。求房间个数,实际上就是在求图中有多少个极大连通子图。

这样去想问题就变得简单了,对每一个房间,深度优先搜索,从而给这个房间能够到达的所有位置染色。最后统计一共用了几种颜色,以及每种颜色的数量。

猜你喜欢

转载自blog.csdn.net/qq_41998938/article/details/84328544