这道题是一道挺基础的染色题
思路:搜索最外层,如果有空洪水就可以沿着空一直往里走,所以要dfs搜索一下。
染色法2.0,改一下输出即可
p1506:
#include<bits/stdc++.> using namespace std; const int maxn=505; int a[maxn][maxn]; int kx[5]={0,1,-1,0,0}; int ky[5]={0,0,0,1,-1}; int x,y; bool jg(int i,int j){ if(i>=1&&i<=x&&j>=1&&j<=y&&a[i][j]==0) return true; else return false; } void dfs(int i,int j){ int x1,y1; a[i][j]=1; for(int d=1;d<=4;d++){ x1=i+kx[d]; y1=j+ky[d]; if(jg(x1,y1)==1) dfs(x1,y1); } } int main() { char c; int i,j,t; cin>>x>>y; getchar(); for(i=1;i<=x;i++){ for(j=1;j<=y;j++){ cin>>c; if(c=='0') a[i][j] =0; else a[i][j]=1; } } int ans=0; for(i=1;i<=y;i++){ if(a[1][i]==0)dfs(1,i); if(a[x][i]==0)dfs(x,i); } for(i=1;i<=x;i++){ if(a[i][1]==0)dfs(i,1); if(a[i][y]==0)dfs(i,y); } for(i=1;i<=x;i++){ for(j=1;j<=y;j++){ if(a[i][j]==0){ ans++; } // cout<<a[i][j]; } //cout<<endl; } cout<<ans<<endl; }
p1162
#include<bits/stdc++.h> using namespace std; const int maxn=505; int a[maxn][maxn]; int b[maxn][maxn]; int kx[5]={0,1,-1,0,0}; int ky[5]={0,0,0,1,-1}; int x,y; bool jg(int i,int j){ if(i>=1&&i<=x&&j>=1&&j<=y&&a[i][j]==0) return true; else return false; } void dfs(int i,int j){ int x1,y1; a[i][j]=1; for(int d=1;d<=4;d++){ x1=i+kx[d]; y1=j+ky[d]; if(jg(x1,y1)==1) dfs(x1,y1); } } int main() { char c; int i,j,t; cin>>x; y=x; getchar(); for(i=1;i<=x;i++){ for(j=1;j<=y;j++){ cin>>c; if(c=='0') a[i][j] =0; else a[i][j]=1; b[i][j]=a[i][j]; } } int ans=0; for(i=1;i<=y;i++){ if(a[1][i]==0)dfs(1,i); if(a[x][i]==0)dfs(x,i); } for(i=1;i<=x;i++){ if(a[i][1]==0)dfs(i,1); if(a[i][y]==0)dfs(i,y); } for(i=1;i<=x;i++){ for(j=1;j<=y;j++){ if(a[i][j]==0){ b[i][j]=2; } } } for(i=1;i<=x;i++){ for(j=1;j<=x;j++){ cout<<b[i][j]<<" "; } cout<<endl; } }