思路来自 大佬 hat.openai.com/c/9c30032e-5fb9-4677-8c15-9ea6530dc6db
题目链接 P1162 填涂颜色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路 搜索
首先 在外面围上一圈0开始搜素
因为题目说将封闭区域内的0变成2 我们可以在外面进行搜索
把外面所有可以搜索走过的区域变成2 这样1围成的封闭区域里的是0;
1作为“围墙”
输出的时候 输出2-a[i][j]
可以走到的地方就变成0
围墙2-1=1 保持不变
封闭区域内的0我们没访问到 未标记 所以2-0=2
于是 实现了将所有封闭区域的0变成2
代码
#include<iostream>
#include<queue>
using namespace std;
int n;
int a[35][35];
queue <pair <int,int> > que;//定义一个可以储存数对的队列
void search(int x,int y){
int dx[5]={0,0,1,0,-1};//设置偏移量
int dy[5]={0,1,0,-1,0};//基本操作 不会可以去搜
que.push(pair<int,int> (x,y));//合法点入队
while(!que.empty() ){
pair<int,int> t=que.front();//取出
que.pop() ;
a[t.first ][t.second ]=2;//标记可以搜到
for(int i=1;i<=4;i++){
if(t.first +dx[i]>=0&&t.first +dx[i] <= n+1)
if(t.second+dy[i]>=0&&t.second+dy[i] <= n+1)//判断是否越界
if(a[t.first +dx[i]][t.second +dy[i]]==0){//如果可以到达该点
que.push(pair<int,int>(t.first +dx[i],t.second +dy[i]));//存入
}
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
search(0,0);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<2-a[i][j]<<' ';
}
cout<<endl;
}
return 0;
}