本题用的是洪水填充法
模板:
void dfs(int x,int y){
if(x==xe && y==ye){
return;
}
for(int i=0;i<=3;i++){
int u=x+c[i];
int v=y+d[i];
if(u>=0&&u<=n+1&&v>=0&&v<=n+1&&a[u][v]==0){
a[u][v]=3;
dfs(u,v);
}
}
}
这样,就把闭合圈外的数字变成三(做标记)
可这样很容易把闭合圈内的数设为3
外面的数还是0
这时,就要扩大纸张了:
输入是扩大
for(i=0;i<=n+1;i++){
for(j=0;j<=n+1;j++){
if(i==0||j==0||i==n+1||j==n+1){
a[i][j]=0;
}else
cin>>a[i][j];
}
}
这样,就进入第二部分了:
就把闭合圈外的数字变成2
void cfs(int x,int y){
for(int i=0;i<=n+1;i++){
for(int j=0;j<=n+1;j++){
if(a[i][j]==0){
a[i][j]=2;
}
}
}
}
把之前标记的数改为0
void bfs(int x,int y){
for(int i=0;i<=n+1;i++){
for(int j=0;j<=n+1;j++){
if(a[i][j]==3){
a[i][j]=0;
}
}
}
}
串起来
xs=ys=0;
xe=ye=n+1;
dfs(xs,ys);
cfs(xs,ys);
bfs(xs,ys);
最后一步:(输出)
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
总结一下:
#include<bits/stdc++.h>
using namespace std;
int k,i,j,flag,xs,ys,xe,ye,n;
int a[101][101];
int c[4]={-1,0,1,0};
int d[4]={0,-1,0,1};
void cfs(int x,int y){
for(int i=0;i<=n+1;i++){
for(int j=0;j<=n+1;j++){
if(a[i][j]==0){
a[i][j]=2;
}
}
}
}
void bfs(int x,int y){
for(int i=0;i<=n+1;i++){
for(int j=0;j<=n+1;j++){
if(a[i][j]==3){
a[i][j]=0;
}
}
}
}
void dfs(int x,int y){
if(x==xe && y==ye){
return;
}
for(int i=0;i<=3;i++){
int u=x+c[i];
int v=y+d[i];
if(u>=0&&u<=n+1&&v>=0&&v<=n+1&&a[u][v]==0){
a[u][v]=3;
dfs(u,v);
}
}
}
int main(){
while(cin>>n){
for(i=0;i<=n+1;i++){
for(j=0;j<=n+1;j++){
if(i==0||j==0||i==n+1||j==n+1){
a[i][j]=0;
}else
cin>>a[i][j];
}
}
xs=ys=0;
xe=ye=n+1;
dfs(xs,ys);
cfs(xs,ys);
bfs(xs,ys);
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
return 0;
}