当前位置: 首页 > news >正文

上海市政府网站建设与对策分析广告联盟app下载

上海市政府网站建设与对策分析,广告联盟app下载,网站域名备案办理拍照,重庆网站推广软件提示: 橙色字体为需要注意部分,红色字体为难点部分,会在文章“重难点解答”部分精讲。 题目链接 蓝桥杯2023年第十四届省赛真题-岛屿个数 - C语言网 题目理解 这道题让我们求岛屿个数,那么我们就应该先弄懂,对于一…

    提示: 橙色字体为需要注意部分,红色字体为难点部分,会在文章“重难点解答”部分精讲。

题目链接

蓝桥杯2023年第十四届省赛真题-岛屿个数 - C语言网

题目理解 

        这道题让我们求岛屿个数,那么我们就应该先弄懂,对于一个岛的定义是什么。(我当时就因为没弄明白这个困扰很久,所以会将细一点)

        让我们直观感受下:

        上图所示情形是一个岛,因为外面有了一圈陆地将里面的小陆地包围了起来,你可以想象成海岛中的池子中有一块大石头(右边的图是我p的,是丑了点,主要为了便于理解)。

        而如果是以下情形,就变成了两个岛

        你可以理解为海水流动性更强,而海岛的岩石又不可能衔接的严丝合缝。海水从那个缺口的地方流了进去,因此中间小块陆地并没有被外圈陆地包围,这种情况下是两个岛。

        那么不难理解题目当中给出的第二组示例为什么是3个岛了吧?

        话不多说,我们继续向下进行。

解题思路 

1.核心思想

        我们用题目给出的第二组用例来讲,如下呢就是地图。

        然后我们以(0,0)为起点使用dfs将外海全部标记为2,为了确保(0,0)是外海且外海是相通的(方便dfs展开),我们将地图外部扩展一圈0。

        dfs展开,将外海全部标记为2

         完成

       然后对全图进行查找,如果有满足标记为‘1’的陆地且与外海相邻,对其进行dfs展开,标记为3。每进行一次dfs,岛屿个数就加1。

2.具体做法 

这段代码的思路是通过深度优先搜索(DFS)来解决问题。下面是代码的详细解释:

  1. 首先,定义了一个二维数组map来表示地图,其中map表示格子的状态。0表示海洋,1表示未标记的陆地,2表示已标记的海洋,3表示已标记的陆地。

  2. 接下来,定义了两个递归函数dfs_seadfs_island,用于进行深度优先搜索。

  3. dfs_sea函数用于将外海的格子标记为2。从给定的坐标(0, 0)开始,如果当前格子是未访问的海洋(即map[x][y] == 0),则将其标记为2,并递归调用dfs_sea函数对周围的8个格子进行展开

  4. dfs_island函数用于将与外海相连的未标记的陆地格子标记为3。从给定的坐标(j, k)开始,如果当前格子是未标记的陆地且该格子的上一个(上下左右都可以,我这里用的是上)格子为外海(即(1==map[j][k])&&(2==map[j-1][k]),则将其标记为3,并递归调用dfs_island函数对周围的4个格子进行展开

  5. 接下来,将二维数组map全部初始化为0。

  6. 调用dfs_sea函数,从坐标(0, 0)开始,将外海的格子标记为2。

  7. 接下来,使用嵌套循环遍历地图的每个格子,如果某个格子是未标记的陆地且与外海相连(即当前格子为1,上方格子为2),则调用dfs_island函数对该陆地进行标记,并将计数器count加1。

  8. 最后,输出计数器count的值,表示与外海相连的未标记陆地的数量。

完整代码 

#include<stdio.h>
int m,n,map[52][52];
void dfs_sea(int x,int y)
{if((x>=0&&x<=m+1)&&(y>=0&&y<=n+1)){if(0==map[x][y])//海水是周围8块进行展开{map[x][y]=2;dfs_sea(x,y+1);dfs_sea(x,y-1);dfs_sea(x+1,y);dfs_sea(x+1,y+1);dfs_sea(x+1,y-1);dfs_sea(x-1,y);dfs_sea(x-1,y+1);dfs_sea(x-1,y-1);}}
}
void dfs_island(int x,int y)
{if((x>=0&&x<=m+1)&&(y>=0&&y<=n+1)){if(1==map[x][y])//陆地是周围4块进行展开{map[x][y]=3;dfs_island(x+1,y); dfs_island(x-1,y); dfs_island(x,y+1);dfs_island(x,y-1);}}
}
main()
{int number;scanf("%d",&number);for(int i=0;i<number;i++){int count=0;scanf("%d%d",&m,&n);for(int j=0;j<=m+1;j++)//将数组全部初始化为0{for(int k=0;k<=n+1;k++){map[j][k]=0;}}for(int j=1;j<=m;j++)//输入地图{for(int k=1;k<=n;k++){scanf("%1d",&map[j][k]);/*‘%1d’的含义为输入长度为1的整形,如果不限制长度则‘11101’会被当场一个数据,而不是5个数据*/}}dfs_sea(0,0); //从(0,0)处进行dfs,将外海全部标记为数字2for(int j=1;j<=m;j++){ for(int k=1;k<=n;k++){if((1==map[j][k])&&(2==map[j-1][k]))
/*当某坐标是未标记过的陆地且其与外海相连,对其dfs*/{dfs_island(j,k);count++;}}}printf("%d\n",count);}
}

重难点解答

为什么海水8方展开,陆地4方展开

        如果在这里有问题,应该回去再看一下题目理解部分。因为海水可以从陆地的缝隙流过去,也就是说海水可以斜着进行扩散,而陆地却只能上下左右展开。

———(如有问题,欢迎评论区提问)———

http://www.hkea.cn/news/549227/

相关文章:

  • 照片展示网站模板宁波seo咨询
  • 奉贤建设机械网站制作长沙网址seo
  • 上海企业网站模板建站常用的网络推广方法
  • 大连零基础网站建设教学培训济南seo优化公司
  • html 做网站案例简单网站推广建设
  • 践行新使命忠诚保大庆网站建设线上广告
  • 定制网站建设服务商商家联盟营销方案
  • 集团官网建设公司外贸seo推广公司
  • 佛山新网站制作平台网站诊断工具
  • 做PPT的网站canvawhois查询
  • 营销型网站建设吉林定制化网站建设
  • 个人网上公司注册流程图新站优化案例
  • 做se要明白网站明星百度指数排名
  • 网页微博草稿箱在哪西安seo推广优化
  • 嘉兴微信网站建设谷歌首页
  • 什么网站做海报b站不收费网站
  • 如何自己做个简单网站seo知识点
  • 有哪些做批发的网站有哪些手续百度推广优化是什么意思
  • 用阿里巴巴店铺做公司网站怎么样引擎搜索有哪些
  • 网页制作软件属于什么软件类别简述seo的优化流程
  • 网站建设 公司新闻谷歌排名网站优化
  • 怎样做自己的vip解析网站佛山外贸seo
  • 我的网站在百度搜不到了seo是什么职业做什么的
  • 网站私信界面国外网站seo免费
  • wordpress mysql类惠州网站seo
  • 为什么做网站必须要用域名举出最新的网络营销的案例
  • 电子请柬网站开发百度竞价推广登录入口
  • 网站设计与推广国际时事新闻2022最新
  • 柬埔寨网站开发营销技巧和营销方法
  • 网站建立价格长沙网站外包公司