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题,把方块看作是节点,相邻两个方块之间如果没有墙,则在方块之间连一条边,这样城堡就能转换成一个图。求房间个数,实际上就是在求图中有多少个极大连通子图。
这样去想问题就变得简单了,对每一个房间,深度优先搜索,从而给这个房间能够到达的所有位置染色。最后统计一共用了几种颜色,以及每种颜色的数量。