题目链接: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;
}