题目:岛屿个数(蓝桥真题)

文章讲述了如何使用深度优先搜索(DFS)算法解决岛屿计数问题,首先标记所有外海区域,然后遍历岛屿并检查其边界条件,确保只有从外海边缘才能找到新岛屿。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:


解题思路:

        可以考虑使用dfs,先用dfs标记全部外海区域(岛屿规模n,m外围的一圈也标记上),再用dfs遍历全部的岛屿接着判断。判断:如果该岛屿的某个点的前一个位置是外海就代表没有被围起来,ans++。

        注意点:1.因为输入方式没有带空格,所以输入时要限制位数--'%1d'。

                       2.每次循环都要memset(d, 0, sizeof(d));


AC代码:

#include<bits/stdc++.h>
int M, N, d[52][52];

int dx[] = {1, -1, 0, 0, 1, 1, -1, -1};
int dy[] = {0, 0, 1, -1, -1, 1, 1, -1};

void dfs_sea(int x, int y)  // 标记外海,用2表示
{
	 d[x][y] = 2;
    //八个方向 
    for(int i = 0; i < 8; i ++)
    {
        int nx = x + dx[i], ny = y + dy[i];
        if((nx < 0 || ny < 0 || nx > M + 1 || ny > N + 1))continue;
        if(d[nx][ny] == 0)dfs_sea(nx, ny);
        
    }
    
}

void dfs_island(int x, int y)  // 遍历全部岛屿,用3表示,同时也表示已被标记
{
     d[x][y] = 3;//搜索过的岛屿不再搜索 
    for(int i = 0; i < 4; i ++)
    {
        int nx = x + dx[i], ny = y + dy[i];
        if(nx < 1 || ny < 1 || nx > M  || ny > N)continue;
        if(d[nx][ny] == 1)
		    dfs_island(nx, ny);
    }

}

int main()
{
    // 请在此输入您的代码
    int T;
    scanf("%d", &T);
    while (T--)
    {
        scanf("%d %d", &M, &N);
        //填充海水(为了每次循环边角无法覆盖元素都要初始化为0)**
    	memset(d, 0, sizeof(d));
        //输入图 
        for (int i = 1; i < M + 1; i++)
        {
            for (int j = 1; j < N + 1; j++)
            {
                scanf("%1d", &d[i][j]);
            }
        }

        dfs_sea(0, 0); //找出所有外海 

        int count;//计算岛屿数量 
        count = 0;
        for (int i = 0; i < M + 2; i++)
        {
            for (int j = 0; j < N + 2; j++)
            {
                if (d[i][j] == 1 && d[i - 1][j] == 2)  // 只能从外海搜索岛屿,所以岛屿前一定是外海“2”
                {
                    dfs_island(i, j);//搜索岛屿 
                    count++;
                }
            }
        }
        printf("%d\n", count);
   
    }
    return 0;
}

知识点:dfs 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值