蓝桥杯题目 岛屿个数

解法:可以发现,子岛屿会被父岛屿包围起来,导致子岛屿是不能借助海水延伸到边界的。

           而父岛屿,是能借助海水或者本身就在边界处了。

        那么只需要用bfs 每找出一块岛屿,就判断一下这块岛屿能不能通过海水延伸到边界以外,如果可以,此时答案+1。  为了方便处理,我们可以在外围加上一圈海水。

        这里要注意两个点,通过海水延伸是可以8个方向的,也是一个踩坑点。

        然后,每次判断一个岛屿能不能跑到边界,需要初始化标记数组,避免和之前的岛屿判断产生冲突。

// 只有 不是子岛屿的 岛屿 才能跑到边界
#include<iostream>
#include<cstring>
#include<queue>
#define x first
#define y second
using namespace std;
const int N=60;
char g[N][N];
bool st[N][N];
bool st2[N][N];
int n,m;
typedef pair<int,int>PII;
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
int bdx[8]={0,1,0,-1,1,1,-1,-1},bdy[8]={1,0,-1,0,1,-1,1,-1};
void init()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
}
void bfs(int x,int y)
{
    queue<PII>q;
    q.push({x,y});
    st[x][y]=true;
    
    while(q.size())
    {
        PII p = q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            int a = p.x + dx[i];
            int b = p.y + dy[i];
            if(a<=0||a>n||b<=0||b>m||st[a][b]||g[a][b]=='0')continue;
            st[a][b]=true;
            q.push({a,b});
        }
    }
}
bool bbfs(int x,int y)
{
    queue<PII>q;
    q.push({x,y});
    memset(st2,false,sizeof st2);
    st2[x][y]=true;
    while(q.size())
    {
        PII p = q.front();
        q.pop();
        for(int i=0;i<8;i++)
        {
            int a = p.x + bdx[i];
            int b = p.y + bdy[i];
            if(st2[a][b]||g[a][b]=='1')continue;
            if(a==0||a==n||b==0||b==m)return true;
            st2[a][b]=true;
            q.push({a,b});
        }
    }
    return false;
}
int main()
{
    init();
    int t;
    cin>>t;
    while(t--)
    {
        int res=0;
        memset(g,'0',sizeof g);
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
                cin>>g[i][j];
        }
        memset(st,false, sizeof st);
        //如果是岛屿,就把他能延申到的点都标记, 再判断这个岛屿能不能跑到边界
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(!st[i][j]&&g[i][j]=='1')
                {
                    bfs(i,j);
                    //不是子岛屿
                   // cout<<i<<" "<<j<<endl;
                    if(bbfs(i,j))
                    {
                        res++;
                    }
                }
            }
        }
        cout<<res<<endl;
    }
}

  • 24
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生命游戏是一个经典的二维细胞自动机模型,因为它展现了自组织、演化、易扩展等特点,并可以用于生物、计算机科学、数学等多个领域。 以下是使用C语言实现生命游戏的代码: #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROWS 20 #define COLS 50 void init_board(int board[ROWS][COLS]) { int i, j; for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { board[i][j] = rand() % 2; } } } void show_board(int board[ROWS][COLS]) { int i, j; for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { if (board[i][j] == 1) { printf("#"); } else { printf("."); } } printf("\n"); } } int count_neighbors(int board[ROWS][COLS], int row, int col) { int count = 0, i, j; for (i = -1; i <= 1; i++) { for (j = -1; j <= 1; j++) { if (i == 0 && j == 0) continue; if (row+i < 0 || row+i >= ROWS) continue; if (col+j < 0 || col+j >= COLS) continue; count += board[row+i][col+j]; } } return count; } void update_board(int board[ROWS][COLS]) { int new_board[ROWS][COLS]; int i, j, count; for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { count = count_neighbors(board, i, j); if (board[i][j] == 1) { if (count < 2 || count > 3) { new_board[i][j] = 0; } else { new_board[i][j] = 1; } } else { if (count == 3) { new_board[i][j] = 1; } else { new_board[i][j] = 0; } } } } for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { board[i][j] = new_board[i][j]; } } } int main() { int board[ROWS][COLS]; srand(time(NULL)); init_board(board); while (1) { show_board(board); update_board(board); printf("\033[2J\033[H"); } return 0; } 该代码使用随机数初始化了一个20行50列的细胞模型图,并重复显示,模拟生命游戏的进化过程。 注意:本AI只提供技术分享,不参与任何违法活动,请用户合法使用技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值