第九屆藍橋杯C/C++A組之全球變暖


題干:

  自己去百度吧,不記得題目了。

題目分析:

(1)先用廣搜(bfs)搜索出一共有多少個島嶼

(2)然后對每個島嶼的‘#’進行處理,即搜索‘#’上下左右四個方向有沒有海,如果沒有海,那么這個島嶼就不會被淹沒

 

代碼如下:

#include <iostream>
#include <queue>
using namespace std;

char Map[1005][1005];
int vis[1005][1005];
int vis1[1005][1005];

typedef struct node
{
    int x;int y;
}Node;

typedef struct record
{
    int x;int y;
}Record;

int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
int n;

void bfs(int i,int j)
{
    queue<Node> q;
    Node n1;
    n1.x=i;n1.y=j;
    q.push(n1);
    vis[i][j]=1;
    while(!q.empty()){
        Node nn=q.front();
        q.pop();
        int x=nn.x;
        int y=nn.y;
        for(int i=0;i<4;i++){
            int xx=x+dir[i][0];
            int yy=y+dir[i][1];
            if(xx>0 && xx<n && yy>0 && yy<n && Map[xx][yy]=='#' && vis[xx][yy]==0){
                vis[xx][yy]=1;
                Node tmp;
                tmp.x=xx;
                tmp.y=yy;
                q.push(tmp);
            }
        }
    }
}

bool is(Record &r1)
{
    queue<Node> q;
    Node n1;
    int sum=0;
    n1.x=r1.x;n1.y=r1.y;
    q.push(n1);
    vis1[r1.x][r1.y]=1;
    while(!q.empty()){
        Node nn=q.front();
        q.pop();
        int x=nn.x;
        int y=nn.y;
        //cout<<x<<" "<<y<<endl;
        for(int i=0;i<4;i++){
            int xx=x+dir[i][0];
            int yy=y+dir[i][1];
            if(xx>0 && xx<n && yy>0 && yy<n && Map[xx][yy]=='#' && vis1[xx][yy]==0){
                vis1[xx][yy]=1;
                Node tmp;
                tmp.x=xx;
                tmp.y=yy;
                q.push(tmp);
            }
        }
        bool judge=true;
        for(int i=0;i<4;i++){
            int xx=x+dir[i][0];
            int yy=y+dir[i][1];
            if(Map[xx][yy]=='.'){
                judge=false;
            } 
        }
        if(judge){
            sum++;
        }
    }
    //cout<<sum<<endl;
    if(sum<=0){
        return false;
    }
    else{
        return true;
    }
}

int main()
{
    int sum2=0;
    cin>>n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin>>Map[i][j];
        }
    }
    
    int cnt=0;
    Record r[1005];
    for(int i=1;i<n-1;i++){
        for(int j=1;j<n-1;j++){
            if(Map[i][j]=='#' && vis[i][j]==0){
                r[cnt].x=i;r[cnt++].y=j;
                bfs(i,j);
            }
        }
    }
    
    /*for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cout<<vis[i][j]<<" ";
        }
        cout<<endl;
    }*/
    
    for(int i=0;i<cnt;i++){
        
        if(is(r[i])){
            sum2++;
        }
    }
    cout<<sum2<<endl;
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM