题目:https://www.luogu.com.cn/problem/P1162
思路:把在墙外面的0全换成1,那剩下的0就换成2
但是由于圈不固定,所以我们要在地图外面跑一圈
比如:
1 1 1 1 1
1 0 0 0 1
1 1 1 1 0
像上面这样的,我们需要多在外面走一圈,找到那个不知道在哪里的圈外0
上代码:
#include<bits/stdc++.h>
using namespace std;
int a[32][32],b[32][32],n,i,j;
int dx[5]={0,1,-1,0,0};
int dy[5]={0,0,0,1,-1};
//定义变量时注意一点,数组要开到32,因为我们是要在这个地图外面环绕一圈再进去的,保证那个一圈不会造成越界
void dfs(int x,int y){//坐标
int k;
if(x<0||y<0||x>n+1||y>n+1||b[x][y]==1){
//如果出边界了,或者撞墙了,或者访问了已经访问过的
return;//再见
}
//否则
b[x][y]=1;//标记我已访问
for(k=1;k<=4;++k){
dfs(x+dx[k],y+dy[k]);//从四个方向接着往外打
}
}
int main(){
//以下均常规
scanf("%d",&n);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(i=1;i<=n;++i){
for(j=1;j<=n;++j){
scanf("%d",&a[i][j]);
b[i][j]=a[i][j];
}
}
//以上均常规
dfs(0,0);//开搜
for(i=1;i<=n;++i){
for(j=1;j<=n;++j){
if(b[i][j]==0){//还没访问,证明在去找它的过程中被墙挡住了,那就是圈里人
printf("2 ");//上色
}
else{//否则
printf("%d ",a[i][j]);//照着原来的出
}
}
printf("\n");
}
return 0;
}
题目总结:
给你一个方阵,让你找到方阵里的圈
将除了栅栏以外的0分为圈内0和圈外0,找到所有圈外0,此题便迎刃而解