P1162 填涂颜色(染色法)

题目描述

由数字 0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 1 构成,围圈时只走上下左右 4 个方向。现要求把闭合圈内的所有空间都填写成 2。例如:6×6 的方阵(n=6),涂色前和涂色后的方阵如下:

0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

输入格式

每组测试数据第一行一个整数 n(1≤n≤30)。

接下来 n 行,由 0 和 1 组成的 n×n 的方阵。

方阵内只有一个闭合圈,圈内至少有一个 00。

输出格式

已经填好数字 2 的完整方阵。

输入输出样例

输入 

6
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1

输出 

0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

说明/提示

对于 100%的数据,1≤n≤30。

第一次看到染色法,太强了

#include
using namespace std;
typedef long long ll;
const int M=4e4+10;
const int N=1e6+10;
int n,m;
int a[35][35];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void init()
{
	for(int i=0;i<=n+1;i++)
	{
		for(int j=0;j<=n+1;j++)
		{
			a[i][j]=2;
		}
	}
}
void dfs(int s,int e)
{
	a[s][e]=0;
	for(int i=0;i<4;i++)
	{
		int xx=s+dx[i];
		int yy=e+dy[i];
		if(xx>=0&&xx<=n+1&&yy>=0&&yy<=n+1&&a[xx][yy]==2)
		dfs(xx,yy);
	}
}
void solve()
{
	cin>>n;
	init();
	for(int i=1;i<=n;i++)
	{
		for(int j=1,x;j<=n;j++)
		{
			cin>>x;
			if(x==1)
			a[i][j]=1;
		}
	}
	dfs(0,0);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cout<>t;
	while(t--)
	{	
		solve();
	}
	return 0;
}

你可能感兴趣的:(算法,c++,深度优先)