標題:全球變暖
你有一張某海域NxN像素的照片,"."表示海洋、"#"表示陸地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中"上下左右"四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。
由於全球變暖導致了海面上升,科學家預測未來幾十年,島嶼邊緣一個像素的範圍會被海水淹沒。具體來說如果一塊陸地像素與海洋相鄰(上下左右四個相鄰像素中有海洋),它就會被淹沒。
例如上圖中的海域未來會變成如下樣子:
.......
.......
.......
.......
....#..
.......
.......
請你計算:依照科學家的預測,照片中有多少島嶼會被完全淹沒。
【輸入格式】
第一行包含一個整數N。 (1 <= N <= 1000)
以下N行N列代表一張海域照片。
照片保證第1行、第1列、第N行、第N列的像素都是海洋。
【輸出格式】
一個整數表示答案。
【輸入樣例】
7
.......
.##....
.##....
....##.
..####.
...###.
.......
【輸出樣例】
1
資源約定:
峯值內存消耗(含虛擬機) < 256M
CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多餘內容。
所有代碼放在同一個源文件中,調試通過後,拷貝提交該源碼。
不要使用package語句。不要使用jdk1.7及以上版本的特性。
主類的名字必須是:Main,否則按無效代碼處理。
思路:
按照題目的過程模擬,首先創建boolean數組,因爲boolean佔用的內存小,遇到‘#’將陸地的座標置爲true就可以了
初始化後判斷其每個陸地的四周是否都有陸地,原始島嶼++,
在被海水淹沒後,再判斷一下還有多少島嶼
最後輸出島嶼之差,就能得到被淹沒的島嶼數量。(注意題幹輸出的什麼)
代碼:
public class 全球變暖_8 {
static boolean photo[][];
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int N;
N = in.nextInt();
photo = new boolean[N+1][N+1];
String line;
int original_island_count = 0;//原來的島嶼數
int nowadays_island_count = 0;//現在的島嶼數
line = in.nextLine();//過濾掉之前輸入的整數的換行符
//錄入照片
for(int i=1;i<=N;i++)
{
line = in.nextLine();
//處理輸入該行的字符串
for(int j=0;j<line.length();j++)
{
if(line.charAt(j)=='#')//如果是陸地,置爲true,並判斷其周圍,能否組成島嶼
{
photo[i][j] = true;
}
}
}
//檢查島嶼數
for(int i=1;i<=N;i++)
{
for(int j=0;j<N;j++)
{
if(photo[i][j])//報告!這有塊陸地!檢查周圍是否都有島嶼
{
if(photo[i-1][j]&&photo[i+1][j]&&photo[i][j-1]&&photo[i][j+1])//如果四周都爲true
{
original_island_count++;
}
}
}
}
//若干年後
for(int i=1;i<=N;i++)
{
for(int j=0;j<N;j++)
{
if(photo[i][j])//報告!這有塊陸地!檢查周圍是否包含海水
{
if(!photo[i-1][j]||!photo[i+1][j]||!photo[i][j-1]||!photo[i][j+1])
{
photo[i][j] = false;//陸地被淹沒
}
}
}
}
//檢查剩餘陸地中有多少島嶼
for(int i=1;i<=N;i++)
{
for(int j=0;j<N;j++)
{
if(photo[i][j])//報告!這有塊陸地!檢查周圍是否都有島嶼
{
if(photo[i-1][j]&&photo[i+1][j]&&photo[i][j-1]&&photo[i][j+1])//如果四周都爲true
{
nowadays_island_count++;
}
}
}
}
System.out.println(original_island_count-nowadays_island_count);//輸出被淹沒的島嶼數量
}
}