全球變暖|2018年藍橋杯B組題解析第九題-fishers


標題:全球變暖

你有一張某海域NxN像素的照片,"."表示海洋、"#"表示陸地,如下所示:

.......
.##....
.##....
....##.
..####.
...###.
.......

其中"上下左右"四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。

由於全球變暖導致了海面上升,科學家預測未來幾十年,島嶼邊緣一個像素的范圍會被海水淹沒。具體來說如果一塊陸地像素與海洋相鄰(上下左右四個相鄰像素中有海洋),它就會被淹沒。

例如上圖中的海域未來會變成如下樣子:

.......
.......
.......
.......
....#..
.......
.......

請你計算:依照科學家的預測,照片中有多少島嶼會被完全淹沒。

7
.###...
.####..
.##....
...###.
..####.
...###.
.......

【輸入格式】
第一行包含一個整數N。 (1 <= N <= 1000)
以下N行N列代表一張海域照片。

照片保證第1行、第1列、第N行、第N列的像素都是海洋。

【輸出格式】
一個整數表示答案。

【輸入樣例】
7
.......
.##....
.##....
....##.
..####.
...###.
.......

【輸出樣例】
1

資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 < 1000ms

請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。

注意:
main函數需要返回0;
只使用ANSI C/ANSI C++ 標准;
不要調用依賴於編譯環境或操作系統的特殊函數。
所有依賴的函數必須明確地在源文件中 #include
不能通過工程設置而省略常用頭文件。

提交程序時,注意選擇所期望的語言類型和編譯器類型。

思路:dfs統計連通分量,這里稍微有點變化:先change一遍改變原地形(天氣變暖,陸地變成海洋),再對新地形進行dfs統計連通分量(島嶼數量)。

代碼:

#include<iostream>
using namespace std;

int n;
int ans = 0;
char a[1010][1010];
char b[1010][1010]; 

void dfs(int x,int y){
	a[x][y] = '.';
	for(int dx = -1;dx<=1;dx++){
		for(int dy = -1;dy<=1;dy++){
			if(dx==dy) continue;
			if(a[x+dx][y+dy] == '#'){
				dfs(x+dx,y+dy);
			}
		}
	}
}

void change(int x,int y){
	//上下左右四個方向 如果有陸地 就將他變成海洋 
	for(int dx = -1;dx<=1;dx++){
		for(int dy = -1;dy<=1;dy++){
			if(dx==dy) continue;
			if(a[x+dx][y+dy] == '#'){
				a[x+dx][y+dy] = '.';
			}
		}
	}
}

int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
			b[i][j] = a[i][j];
		}
	}
	//天氣變暖后 陸地淹沒 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(a[i][j] == '.' && b[i][j] == '.'){
				change(i,j);
			}
		}
	}
	//剩下陸地 組成島嶼 開始dfs統計島嶼數目(連通分量) 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(a[i][j] == '#'){
				ans++;
				dfs(i,j);
			}
		}
	}	
	cout<<ans<<endl; 
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM