1. 程式人生 > 其它 >java實戰14:全球變暖

java實戰14:全球變暖

技術標籤:筆記javajava演算法程式語言陣列eclipse

java實戰14:全球變暖

藍橋杯第九屆java省賽A組8.

原題:
標題:全球變暖

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

在這裡插入圖片描述

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

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

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

在這裡插入圖片描述

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

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

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

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

【輸入樣例】
7

.##…
.##…
…##.
…####.
…###.

【輸出樣例】
1


題意解讀:
島嶼:有幾個完全獨立的陸地部分就有幾座島嶼。本題裡左上角四個是一塊島嶼,右側九個是一塊島嶼。

思路:
(1)這題和長草問題很像。也很容易實現。就按照題中說的,有一邊挨著海洋就淹沒,只有全不挨著海洋才能不被淹沒。
(2)先找到中心,中心一定不會被淹沒,用sign陣列儲存中心還用於判斷那種最終兩個中心挨一塊的情況,實際上是一個島嶼,而此時計數t=2,再用sign判斷一遍是否挨著,挨著t-1。

(2)重點:!!!!!!!!!是很巧妙的方法
建陣列的時候可以上下左右多擴充套件一排位置。就可以防止在比較上下左右是否為陸地時陣列溢位或不存在a[-1][-1]的情況。
(3)注意:!!!!!!!!!
用sign判斷一遍是否挨著的時候只選擇a[i][j]的右下兩個方向判斷,防止判斷過了t減完1了又減一次。

程式碼如下:

import java.util.Scanner;
public class province_8 {
	public static void main(String[] args) {
		Scanner reader=new Scanner(System.in);
		int
n=reader.nextInt(); int t=0;//計數 char[][] a=new char[n+2][n+2];//將所有陣列包圍起來,不會溢位了 int[][] sign=new int[n+2][n+2]; String[] s=new String[n]; for(int i=0;i<n;i++) { s[i]=reader.next(); } //讀入字元 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { a[i][j]=s[i-1].charAt(j-1); } } //找到中心,中心一定不會被淹沒,用sign陣列儲存中心 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(a[i][j]=='#') { if(a[i-1][j]=='#'&&a[i+1][j]=='#'&&a[i][j-1]=='#'&&a[i][j+1]=='#') { a[i][j]='#'; sign[i][j]=1; t++; } } } } //將邊界淹沒 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(sign[i][j]!=1) { a[i][j]='.'; } } } //除去中心挨一塊的情況 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(sign[i][j]==1&&(sign[i+1][j]==1||sign[i][j+1]==1)) { t--; } } } System.out.println(t); } } /* 7 ....... .##.... .##.... ....##. ..####. ...###. ....... */

執行結果:
1