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

最大的湖

题目描述

 

运行代码

#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…

2024年,企业的人才管理怎么做?这5点是关键!

当今时代&#xff0c;各行各业都面临着激烈的竞争。这些竞争归根结底都是人才的竞争。企业若想在竞争中掌握主动权&#xff0c;实现基业长青&#xff0c;就必须努力留住人才&#xff0c;并充分发挥他们的积极性、主动性和创造性。因此&#xff0c;做好人才管理是企业实现长期可…

如何找到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;帮助识别潜在的问题并采取…

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

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

Socket CAN中ctrlmode有哪些?

在Linux中,socketcan 的 ctrlmode 是一个用于配置CAN设备控制模式的标志字段。该字段的值由一组标志位组成,这些标志位控制CAN设备的各种操作模式。以下是一些常见的 ctrlmode 标志及其含义: CAN_CTRLMODE_LOOPBACK: 描述:启用回环模式。作用:设备在发送帧的同时会接收它…

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

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

Linux服务器自动监听Web应用接口,未响应自动重启JAVA应用脚本

近期部署了一个多台负载的应用在linux服务器&#xff0c;但总有其中的某台服务器应用会出现假死&#xff0c;导致dubbo请求出现RPC调用失败。当然主要问题肯定是程序上的某些问题导致的。但无法快速定位排查&#xff0c;所以弄个脚本自动监听接口&#xff0c;当出现未响应&…

《NoSQL数据库技术与应用》 MongoDB副本集

《NoSQL数据库技术与应用》 教学设计 课程名称&#xff1a;NoSQL数据库技术与应用 授课年级&#xff1a; 20xx年级 授课学期&#xff1a; 20xx学年第一学期 教师姓名&#xff1a; 某某老师 2020年5月6日 课题 名称 第4章 MongoDB副本集 计划学时 8课时 内容 分析 独立模式可…

第四十四天 完全背包理论 | 518.零钱兑换||

1.dp[j]含义&#xff1a;容量为j的背包&#xff0c;有一些可重复放入的物品&#xff0c;放满这个背包的最大价值 完全背包中每个物品可以使用无数次&#xff1a;遍历背包时采用正序遍历 &#xff08;对于纯完全背包问题&#xff09;先遍历物品还是先遍历背包无所谓&#xff1…

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

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

GitHub的原理及应用详解(五)

本系列文章简介&#xff1a; GitHub是一个基于Git版本控制系统的代码托管平台&#xff0c;为开发者提供了一个方便的协作和版本管理的工具。它广泛应用于软件开发项目中&#xff0c;包括但不限于代码托管、协作开发、版本控制、错误追踪、持续集成等方面。 GitHub的原理可以简单…

使用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…

Mac | 关于 Mac 桌面文件无法显示

现象问题 电脑配置&#xff1a;MacBook Pro M1&#xff0c;系统 Ventura 13.6.7 最近在不知道是不是安装了什么软件&#xff0c;导致桌面上的文件看不到了&#xff0c;但是在访达里的桌面还是可以看到文件&#xff0c;而且开启台前调度的时候&#xff0c;也不会返回桌面了。检查…

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

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

Spring Boot中集成 SSE

目录 SSE简介SSE原理SSE的使用场景在Spring Boot中集成SSE 创建Spring Boot项目添加依赖创建SSE控制器前端使用SSE详细案例&#xff1a;股票价格实时推送 总结 SSE简介 服务器发送事件&#xff08;Server-Sent Events&#xff0c;SSE&#xff09;是一种在HTTP协议上实现的服…

QT--splitter的使用

提示&#xff1a;本文为学习记录&#xff0c;若有错误&#xff0c;请联系作者&#xff0c;谦虚受教。 文章目录 前言一、实现步骤二、使用步骤1.新建splitter2.splitter的使用3.splitter大小 总结 前言 一、实现步骤 创建 QTabWidget&#xff1a;首先&#xff0c;确保你有一个…

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

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