填充问题

题目链接:https://www.luogu.com.cn/problem/P1162

题目描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述

解析

(1)算法思想:DFS和BFS都可以解决问题,但是DFS如果是使用递归当问题规模较大时容易爆栈,所以一般用BFS。
(2)如何选定种子点:
  开始时我陷入了一个误区,认为第一个满足左右有1(边界),且值为0的点就是一个内部点。但是并不是这样,比如下面这个测试点,位置(0,7)并不是内部点,不能作为种子点。那么如何正确地选定一个种子点呢?
  结论:第一个“1”的第一个右下角位置一点是内部“0”。
  在这里插入图片描述

AC代码

#include<bits/stdc++.h>
using namespace std;
struct node {
	int x,y;
} s; 
int matrix[30][30],dx[4]= {0,1,0,-1},dy[4]= {1,0,-1,0};
bool inq[30][30];
int main() {
	int n;
	cin>>n;
	bool flag=0;
	for(int i=0; i<n; i++) {
		for(int j=0; j<n; j++) {
			scanf("%d",&matrix[i][j]);
			if(flag==0&&matrix[i][j]==1){
				s={i+1,j+1}; 		//种子点 
				flag=1;
			}
		}
	}
	queue<node> q;
	q.push(s);
	inq[s.x][s.y]=1;
	while(!q.empty()) {
		node now=q.front();
		q.pop();
		matrix[now.x][now.y]=2;
		for(int i=0; i<4; i++) {
			int x=now.x+dx[i],y=now.y+dy[i];
			if(!inq[x][y]&&matrix[x][y]==0) {
				q.push({x,y});
				inq[x][y]=1;
			}
		}
	}
	for(int i=0; i<n; i++) {
		for(int j=0; j<n; j++) {
			if(j!=0) printf(" ");
			printf("%d",matrix[i][j]);
		}
		printf("\n");
	}
	return 0;
}
发布了136 篇原创文章 · 获赞 12 · 访问量 6090

猜你喜欢

转载自blog.csdn.net/weixin_43590232/article/details/104722567