java實戰14:全球變暖
阿新 • • 發佈:2021-01-24
技術標籤:筆記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。
建陣列的時候可以上下左右多擴充套件一排位置。就可以防止在比較上下左右是否為陸地時陣列溢位或不存在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