第九届蓝桥杯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;
}
原文地址:https://www.cnblogs.com/ACPIE-liusiqi/p/8687943.html