題目鏈接: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;
}