1. 程式人生 > >C程式--第九屆藍橋杯--全球變暖

C程式--第九屆藍橋杯--全球變暖


標題:全球變暖

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

.......
.##....
.##....
....##.
..####.
...###.
.......

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

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

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

.......
.......
.......
.......
....#..
.......
.......

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

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

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

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

【輸入樣例】

.......
.##....
.##....
....##.
..####.
...###.
.......  

【輸出樣例】
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;
}