P1162 填涂颜色
题目:
链接 https://www.luogu.com.cn/problem/P1162
思路:
根据题目得出,是闭合圈那里面的数一定不能到边界,那么转换一下就是把所有开放圈变成1,剩下的就是闭合圈了,所以从边界出发把所有闭合圈染成1即可。
代码:
#include <bits/stdc++.h>
using namespace std;
int n,a[50][50],b[50][50];
void dfs(int i,int j) {
if(i<0||i>=n||j<0||j>=n) return; //数组边界
if(a[i+1][j]==0&&b[i+1][j]==0) { // 未染 进入dfs搜索
b[i+1][j]=1;//感染
dfs(i+1,j);
}
if(a[i-1][j]==0&&b[i-1][j]==0) {// 未染 进入dfs搜索
b[i-1][j]=1;//感染
dfs(i-1,j);
}
if(a[i][j-1]==0&&b[i][j-1]==0) {// 未染 进入dfs搜索
b[i][j-1]=1;//感染
dfs(i,j-1);
}
if(a[i][j+1]==0&&b[i][j+1]==0) {// 未染 进入dfs搜索
b[i][j+1]=1;//感染
dfs(i,j+1);
}
}
int main() {
cin >> n;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
cin >> a[i][j];
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
b[i][j]=a[i][j];
for(int i=0; i<n; i++) { //上下左右边界
if(a[0][i]==0&&b[0][i]==0) dfs(0,i);//如果边界为0代表有开放圈 进入dfs
if(a[n-1][i]==0&&b[n-1][i]==0) dfs(n-1,i);
if(a[i][0]==0&&b[i][0]==0) dfs(i,0);
if(a[i][n-1]==0&&b[i][n-1]==0) dfs(i,n-1);
}
for(int i=0; i<n; i++) //剩下的就是闭合圈
for(int j=0; j<n; j++)
if(b[i][j]==0&&a[i][j]==0)a[i][j]=2;
for(int i=0; i<n; i++) {//输出
for(int j=0; j<n; j++)
cout << a[i][j] <<' ';
cout << endl;
}
return 0;
}