C程式--第九屆藍橋杯--全球變暖
標題:全球變暖
你有一張某海域NxN畫素的照片,"."表示海洋、"#"表示陸地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中"上下左右"四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。
由於全球變暖導致了海面上升,科學家預測未來幾十年,島嶼邊緣一個畫素的範圍會被海水淹沒。具體來說如果一塊陸地畫素與海洋相鄰(上下左右四個相鄰畫素中有海洋),它就會被淹沒。
例如上圖中的海域未來會變成如下樣子:
.......
.......
.......
.......
....#..
.......
.......
請你計算:依照科學家的預測,照片中有多少島嶼會被完全淹沒。
【輸入格式】
第一行包含一個整數N。 (1 <= N <= 1000)
以下N行N列代表一張海域照片。
照片保證第1行、第1列、第N行、第N列的畫素都是海洋。
【輸出格式】
一個整數表示答案。
【輸入樣例】
7
.......
.##....
.##....
....##.
..####.
...###.
.......
【輸出樣例】
1
資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。
注意:
main函式需要返回0;
只使用ANSI C/ANSI C++ 標準;
不要呼叫依賴於編譯環境或作業系統的特殊函式。
所有依賴的函式必須明確地在原始檔中 #include <xxx>
不能通過工程設定而省略常用標頭檔案。
提交程式時,注意選擇所期望的語言型別和編譯器型別。
#include <iostream>
#include <stdio.h>
#define N 30
#define M 7
char map[N][N];
char map1[N][N];
void shuru( )//輸入資料
{
freopen ("shuju.txt","r",stdin);
for (int i=0;i<M;i++)
{
for (int j=0;j<M+1;j++)
{
scanf ("%c",&map[i][j]);
}
}
}
void shuchu( )//列印照片
{
for (int i=0;i<M;i++)
{
for (int j=0;j<M;j++)
{
printf ("%c",map[i][j]);
}
printf ("\n");
}
printf ("\n");
}
void dfs(int i,int j)//深度搜索 ,把所有地方變成海 ,用於計算島嶼數量
{
map[i][j]='.';//將該位置變成海
//以改點為中心,搜尋九宮格
for (int dx=-1;dx<=1;dx++)
{
for (int dy=-1;dy<=1;dy++)
{
int x=i+dx;
int y=i+dy;
if (0<=x&&x<=M&&0<=y&&y<=M&&map[x][y]=='#')//判斷若出現島嶼,則需變成海
dfs(x,y);
}
}
}
void dfs1(int i,int j)//把島嶼臨海部分變成海洋
{
if (map[i+1][j]=='.'||map[i-1][j]=='.')
map[i][j]='*';
if (map[i][j+1]=='.'||map[i][j-1]=='.')
map[i][j]='*';
}
void solve( )
{
int ans1=0,ans2=0;
shuru ( );
shuchu ( ); //檢視資料是否準確
for (int i=0;i<M;i++)
{
for (int j=0;j<M;j++)
{
if (map[i][j]=='#')
{
dfs(i,j);
ans2++;//統計島嶼數量
}
}
}
shuchu ( );
shuru ( );//檢視是否完全變成海洋
// shuchu ( );
for (int i=0;i<M;i++)
{
for (int j=0;j<M;j++)
{
if (map[i][j]=='#')
{
dfs1(i,j);//把島嶼臨海部分變成海洋
}
}
}
shuchu( );
for (int i=0;i<M;i++)
{
for (int j=0;j<M;j++)
{
if (map[i][j]=='#')
{
dfs(i,j);//判斷島嶼臨海部分變成海洋後還有幾個島嶼
ans1++;//
}
}
}
printf ("%d\n",ans2-ans1); //原來島嶼數量減去現在島嶼數量
}
int main( )
{
solve( );
return 0;
}