填充問題

題目鏈接: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章