88888888y

导航

 

题目: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,此题便迎刃而解
posted on 2022-03-06 12:02  88888888y  阅读(49)  评论(0)    收藏  举报