P1162 填涂颜色
思路:
首先要找到闭合中的第一个数(因为使用了双重循环,而且只有一个闭环,所以找到了就可以了,f函数),然后在使用找到的第一个数对闭环中的数字进行改变(ff函数);
我对题中的数据改了改,图中的0改为了1,1改为2,这样做的目的是数组直接赋0,如果搜索的时候搜索到0,说明了到数组的边界了,直接return ,并且这样做可以不用考虑边界的问题。
使用了flag标记,如果f函数中始终没有出现边界,说明这是一个闭环,就是找到了闭环中的第一个数
#include<bits/stdc++.h>
using namespace std;
int mapp[35][35]={0};
int visit[35][35]={0};
int flag=0;
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
void f(int x,int y){
if(mapp[x][y]==0){
flag=1;//如果到边界了,说明不是闭环
return;
}
if(mapp[x][y]==2){
return;
}
else{
for(int i=0;i<4;i++){
visit[x][y]=1;
int a=dx[i]+x;
int b=dy[i]+y;
if(visit[a][b]==0){
f(a,b);
}
}
}
}
void ff(int x,int y){
if(mapp[x][y]==2){
return;
}
else if(mapp[x][y]==1){
for(int i=0;i<4;i++){
mapp[x][y]=3;
int a=x+dx[i];
int b=y+dy[i];
ff(a,b);
}
};
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int m;
cin>>m;
mapp[i][j]=m+1;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(mapp[i][j]==1&&visit[i][j]==0){
flag=0;
f(i,j);
if(flag==0){
ff(i,j);
for(int k1=1;k1<=n;k1++){
for(int k2=1;k2<=n;k2++){
if(k2==1){
cout<<mapp[k1][k2]-1;
}
else
cout<<" "<<mapp[k1][k2]-1;
}
cout<<endl;
}
return 0;
}
}
}
}
return 0;
}