【藍橋杯 全球變暖】模擬思路

標題:全球變暖

你有一張某海域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);//輸出被淹沒的島嶼數量
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章