每日练习之深度优先搜索——最大的湖

最大的湖

题目描述

 

运行代码

#include<iostream>
using namespace std;
bool mp[102][102];
int sum,num;
int N,M,K;
int dfs(int x,int y )
{if( mp[x][y] ){mp[x][y]=0;sum++;dfs(x+1,y);dfs(x-1,y);dfs(x,y+1);dfs(x,y-1);}return 0;
}
int main()
{cin>>N>>M>>K;int x,y;for( int i=1;i<=K;i++ ){cin>>x>>y;mp[x][y]=1;}for( int i=1;i<=N;i++ ){for( int j=1;j<=M;j++ ){sum=0;dfs(i,j);num=max(num,sum);}}cout<<num;return 0;
}
代码思路
  1. 初始化
    • 定义了一个二维数组mp,用于表示网格的状态,其中1表示已占用或可达的位置,0表示空位置。
    • 定义了三个整数变量sumnumK,以及两个整数变量NM,分别用于表示当前连通块的大小、最大连通块的大小、已标记的位置数量、网格的行数和列数。
  2. 读取输入
    • 从标准输入读取网格的行数N、列数M和已占用位置的个数K
    • 使用循环读取K个已占用位置的坐标(x, y),并在mp数组中将其标记为1。
  3. DFS遍历
    • 使用了两层嵌套循环遍历整个网格的每一个位置(i, j)
    • 对于每一个位置(i, j),都重置sum为0,然后调用dfs函数来搜索以(i, j)为起点的连通块大小。
    • dfs函数递归地访问当前位置的上下左右四个相邻位置,如果相邻位置是已占用的(即mp[x][y]为1),则将其标记为已访问(即mp[x][y]设为0)并将sum加1。然后继续递归访问该相邻位置的相邻位置。
    • 在每次dfs调用结束后,使用max函数更新num为当前连通块大小sumnum中的较大值。
  4. 输出结果:在遍历完整个网格后,输出最大连通块的大小num

改进建议

问题
  1. 变量初始化num没有初始化为0,这可能会导致未定义的行为,因为num可能包含任意值。
  2. DFS逻辑:在dfs函数中,你递归地探索了当前位置的四个方向(上、下、左、右)。但是,你没有检查递归调用是否越界(即,是否仍然在网格内)。
  3. 不必要的重复计算:在main函数中,你使用了两层循环遍历整个网格,并对每个位置都调用dfs。但是,一旦你找到一个1并调用了dfs,你就不需要再次对同一个位置调用dfs,因为该位置及其连通块已经被标记为0了。
  4. 性能问题:由于上述不必要的重复计算,该代码的性能非常差。
改进方向
  1. 初始化变量:在main函数的开始处,将num初始化为0。
  2. 边界检查:在dfs函数中,添加边界检查以确保递归调用不会越界。
  3. 避免重复计算:在遍历网格时,只对值为1的位置调用dfs,并在调用后立即将其标记为已访问(例如,使用另一个布尔数组或将其值更改为一个特殊的“已访问”值)。
  4. 使用队列或栈进行BFS或DFS:虽然递归DFS在这里可以工作,但使用队列或栈可能会更清晰,并减少递归调用栈的深度。

改进代码

#include<iostream>  
#include<vector>  
#include<algorithm>  
using namespace std;  
bool mp[102][102];  
bool visited[102][102]; // 用于标记已访问的位置  
int maxArea = 0;  
void dfs(int x, int y, int& area, int N, int M) {  if (x < 1 || x > N || y < 1 || y > M || !mp[x][y] || visited[x][y]) return;  visited[x][y] = true;  area++;  dfs(x+1, y, area, N, M);  dfs(x-1, y, area, N, M);  dfs(x, y+1, area, N, M);  dfs(x, y-1, area, N, M);  
}   
int main() {  int N, M, K;  cin >> N >> M >> K;  int x, y;  for (int i = 0; i < K; i++) {  cin >> x >> y;  mp[x][y] = true;  }  for (int i = 1; i <= N; i++) {  for (int j = 1; j <= M; j++) {  if (mp[i][j] && !visited[i][j]) {  int area = 0;  dfs(i, j, area, N, M);  maxArea = max(maxArea, area);  }  }  }  cout << maxArea << endl;  return 0;  
}
代码思路
  1. 初始化
    • 声明了两个二维数组mpvisited,其中mp用于存储网格的初始状态(0表示空,1表示占用),visited用于标记在DFS过程中已经访问过的位置。
    • 声明了一个变量maxArea来记录找到的最大连通块的大小,并将其初始化为0。
  2. 读取输入
    • 从输入中读取网格的维度NM,以及占用位置的个数K
    • 对于每个占用位置,读取其坐标(x, y),并在mp数组中将其标记为1。
  3. DFS遍历
    • 使用两层循环遍历整个网格。
    • 对于每个位置(i, j),如果它是占用的(mp[i][j]为1)且尚未被访问过(visited[i][j]false),则调用DFS函数来搜索该位置所在的连通块。
    • 在DFS函数中,首先检查当前位置(x, y)是否在网格内、是否被占用且未被访问过。如果是,则将其标记为已访问,并将当前连通块的大小加1。
    • 然后,递归地调用DFS函数来搜索当前位置的上、下、左、右四个相邻位置。
    • 每次DFS调用结束后,更新maxArea为当前连通块大小和maxArea中的较大值。
  4. 输出结果:在遍历完整个网格后,输出找到的最大连通块的大小maxArea

注意点:改进代码为  AI优化原代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/14958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【每日一题】52.20个机器学习问题 2 (模型部署、实践流程和应用问题)

在上一篇《20个机器学习问答题》中&#xff0c;问题主要围绕机器学习的基础概念和理论知识。 这次&#xff0c;本篇内容针对机器学习的实践和应用继续提出了20个不同的问题。【点击跳转原文】 在实际应用中&#xff0c;机器学习模型的建立流程是怎样的&#xff1f; 机器学习模…

使用delphi11编写一个基于xls作为数据库的照片展示程序

1、创建xls文档可以参考前一篇博客&#xff0c;并使用wps将文档保存为2003格式xls后缀。 2、在form上面放置adoconnection、adotable、datasource、spinedit、timer、checkbox、image、4个button组件。 image的设置&#xff1a; Image1.Align : alClient; Image1.Center : Tr…

如何找到docker的run(启动命令)

使用python三方库进行 需要安装python解释器 安装runlike安装包 pip3 install runlike 运行命令 runlike -p <container_name> # 后面可以是容器名和容器id&#xff0c;-p参数是显示自动换行实验 使用docker启动一个jenkins 启动命令为 docker run -d \ -p 9002:80…

无线领夹麦克风哪个品牌音质最好,揭秘无线领夹麦哪个牌子好用

​随着社交媒体和内容创作的兴起&#xff0c;清晰可靠的音频捕捉已成为打造高品质作品的关键要素。无线领夹麦克风因其轻巧设计和用户友好的接口而受到青睐&#xff0c;它能够确保你的声音在任何环境下都能被完美捕捉。经过精心测试和对比&#xff0c;以下几款无线领夹麦克风是…

大数据学习之安装并配置maven环境

什么是Maven Maven字面意&#xff1a;专家、内行Maven是一款自动化构建工具&#xff0c;专注服务于Java平台的项目构建和依赖管理。依赖管理&#xff1a;jar之间的依赖关系&#xff0c;jar包管理问题统称为依赖管理项目构建&#xff1a;项目构建不等同于项目创建 项目构建是一…

C语言——⾼位优先与低位优先的不同之处是什么?

一、问题 C语⾔的最⼤特⾊就是可移植性好。根据机器类型的不同&#xff0c;⾼位优先与低位优先也不同。那么&#xff0c;最好的可移植的 C 程序应该同时适⽤这两种类型的计算机。下⾯了解⼀下⾼位优先与低位优先的不同之处。 二、解答 所谓的⾼位优先&#xff0c;就是最低的地…

使用docker-compose部署时序数据库InfluxDB1.8.4

背景 如今 InfluxDB 已经更新到了 2.x &#xff0c; InfluxDB 1.x 和 2.x 版本之间有几个主要的区别&#xff1a; 数据模型&#xff1a; 1.x&#xff1a;使用数据库和保留策略来组织数据。 2.x&#xff1a;引入了组织&#xff08;organizations&#xff09;和存储桶&#xff…

牛客NC236 最大差值【simple 动态规划 Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/a01abbdc52ba4d5f8777fb5dae91b204 思路 不难看出该题可以使用动态规划的方式解题。 在循环数组的过程中&#xff0c;记录截止到当前位置-1的最小值&#xff0c; 然后用当前的值去计算最大的差值。Java代码 im…

融媒宝:群发自媒体平台的神器,注册送7天中级会员

近几年自媒体比较火&#xff0c;做自媒体往往需要发布文章或视频到多个平台&#xff0c;如手工复制粘贴逐一发布&#xff0c;委实费时费力、效率不高。今天就给大家分享一款提高自媒体运营效率的神器--融媒宝&#xff1a; 融媒宝简介 融媒宝是一款可免费使用的高效自媒体工具…

22个C语言小白常见问题总结

一.语言使用错误 在打代码的过程中&#xff0c;经常需要在中文与英文中进行转换&#xff0c;因此常出现一些符号一不小心就用错&#xff0c;用成中文。例如&#xff1a;“&#xff1b;”中文中的分号占用了两个字节&#xff0c;而英文中“;”分号只占用一个字节。编译器只能识…

Scala的简单学习一

一 相关知识 1.1 scala的安装 1.在idea中导入依赖&#xff0c;并在Idea下载scala插件 1.2 scala基础知识点 1.scala代码中一行语句的结束是以换行符为标准&#xff0c;可以不用写分号 2.class是一个普通的类&#xff0c;object相当于一个单例对象&#xff0c;object类中的…

OpenStack配置 之 不同cpu迁移虚拟机

介绍 OpenStack是一个开源的云计算管理平台项目&#xff0c;是一系列软件开源项目的组合。 OpenStack由NASA&#xff08;美国国家航空航天局&#xff09;和Rackspace合作研发并发起&#xff0c;以Apache许可证&#xff08;Apache软件基金会发布的一个自由软件许可证&#xff…

Vue的router.addRoutes不起作用

Vue的router.addRoutes()不起作用解决方案 最近在学习制作后台管理系统的时候&#xff0c;涉及到了权限&#xff0c;在通过后台获取到数据后使用router.addRoutes()时不起作用。 最终发现左侧菜单组件中的路由是根据this.$router.options.routes来渲染的&#xff0c;最终使用…

sw套合样条曲线

套合样条曲线,可以变成一条曲线,然后可以进行分段

UOS1060e分离ssh与sftp服务

文章目录 原理一、sftp 用户与目录二、ssh 和 sftp 服务分离三、启动与停止四、验证 原理 SFTP是SSH的一部分&#xff0c;SFTP没有单独的守护进程&#xff0c;它必须使用SSHD守护进程&#xff08;端口号默认是22&#xff09;来完成相应的连接操作。 通过新建另一个‘sshd’进程…

rclone迁移对象存储之间的数据

1 概述 rclone是一款文件复制工具&#xff0c;既可以用于在linux主机之间复制文件&#xff0c;也可以在对象存储之间复制文件。 rclone的官网为&#xff1a; https://rclone.orgrlcone关于对象存储的官方文档为&#xff1a; https://rclone.org/s32 安装 2.1 yum安装 yum …

PY32F系列32位单片机 特殊引脚复用说明

一 、 PY32F030 系 列 &#xff0c; 包 括 PY32F030 、PY32F003、 PY32F002A、 XL32F003 的特殊引脚使用说明。 1、晶振引脚的复用&#xff0c;使用 HSE/LSE 引脚作为 GPIO 功能引脚时&#xff0c;只要没有配置相关功能的情况下&#xff0c;正常配置 GPIO 功能即可。 其中&am…

SpringBoot3.x 整合 Spring AI

Spring AI 已经发布了一段时间&#xff0c;虽然推出的时候就被人说只是一个套了 API 的壳&#xff0c;但是作为 Spring 生态的一个开源项目&#xff0c;用它来结合到现有业务系统中还是一个比较好的方案&#xff0c;毕竟像笔者当初为了接入 OpenAI 的 API&#xff0c;还专门学了…

pcd点云江湖之处处碰壁:点云文件pcd加载02

江湖好汉&#xff0c;休走&#xff0c;废了半天力气把threejs自带的代码搬迁到自己项目中了&#xff0c;高高兴兴给领导看。领导一句话&#xff0c;顿时无奈&#xff1a;领导曰&#xff1a;点云单色太丑&#xff0c;能不能按照分类展示&#xff1f; 一句话难道英雄好汉&#xf…

eclipse配置JDK和Tomcat

eclipse配置JDK jdk配置 配置JDK&#xff1a; 首先&#xff0c;确保JDK已经安装并配置了环境变量。这包括设置JAVA_HOME环境变量&#xff0c;指向JDK的安装目录&#xff0c;以及更新CLASSPATH和PATH环境变量以包含JDK的bin目录。 在Eclipse中&#xff0c;通过Window > Pre…