zoukankan      html  css  js  c++  java
  • 第九届蓝桥杯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;
    }
  • 相关阅读:
    【转】排序总结(总结的非常好)
    [转]C#中使用指针实现高效比较字符串的小技巧
    高斯消元法
    排序算法性能和使用场景总结
    斐波那契数列Log(n)算法
    C#部分方法定义
    杂项记录
    C#指针复习示例zz
    【转】斐波那契数列算法分析
    【转】矩阵乘法
  • 原文地址:https://www.cnblogs.com/ACPIE-liusiqi/p/8687943.html
Copyright © 2011-2022 走看看