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

最大的湖

题目描述

 

运行代码

#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优化原代码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【B站 heima】小兔鲜Vue3 项目学习笔记Day02

文章目录 Pinia1.使用2. pinia-计数器案例3. getters实现4. 异步action5. storeToRefsx 数据解构保持响应式6. pinia 调试 项目起步1.项目初始化和git管理2. 使用ElementPlus3. ElementPlus 主题色定制4. axios 基础配置5. 路由设计6. 静态资源初始化和 Error lens安装7.scss自…

无人机+飞行服务:无人机飞防服务(打药+施肥+播种)技术详解

无人机飞防服务&#xff0c;结合了先进的无人机技术与农业实践&#xff0c;为现代农业提供了高效、精准的打药、施肥和播种解决方案。以下是对这些技术的详细解析&#xff1a; 一、无人机打药技术 无人机打药技术利用无人机搭载喷雾设备&#xff0c;对农田进行精准施药。通过…

【Numpy】深入解析numpy.mgrid()函数

numpy.mgrid()&#xff1a;多维网格生成与数值计算的利器 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393…

vuejs路由和组件系统

前端路由原理 createRouter * hash* window.addEventListener(hashChange)* 两种实现路由切换的模式&#xff1a;UI组件&#xff08;router-link&#xff0c;router-view&#xff09;&#xff0c;Api&#xff08;push()方法&#xff09; * history * HTML5新增的API &#xff0…

Qt下使用QImage和OpenCV实现图像的拼接与融合

文章目录 前言一、使用QImage进行水平拼接二、使用OpenCV进行水平拼接三、使用OpenCV进行图像融合四、示例完整代码总结 前言 本文主要讲述了在Qt下使用QImage和OpenCV实现图像的拼接与融合&#xff0c;并结合相应的示例进行讲解&#xff0c;以便大家学习&#xff0c;如有错误…

分割文本文件

分割一个.txt文件&#xff0c;可以选择在命令行中使用split指令&#xff0c;或者编写一段脚本进行操作。以下是一个简单的Python脚本来分割文本文件&#xff1a; def split_file(file, lines):# Open source filewith open(file, r) as source:count 0atEOF Falsewhile not …

齐护K210系列教程(三十四)_视觉PID巡线小车

视觉PID巡线小车 1.前言2.简介3.代码讲解3.1初始化3.2.色块查找3.3色块分析3.3.1 区域13.3.2 区域2 3.4 侦测关键点部分3.4.1正常巡线3.4.2 右转路口 3.4.3十字路口3.4. PID计算 4.完整代码5.小车端程序6.参考程序联系我们 1.前言 本课程主要讲述如何使用AIstart_k210主板完成…

SpringMVC接收请求参数的方式:

接收简单变量的请求参数 直接使用简单变量作为形参进行接收&#xff08;这里简单变量名称需要与接收的参数名称保持一致&#xff0c;否则需要加上RequestParam注解&#xff09;&#xff1a; 细节&#xff1a; 1&#xff1a;SpringMVC会针对常见类型&#xff08;八种基本类型及…

【Crypto】一眼就解密

文章目录 前言一眼就解密解题感悟 前言 Basic写累了&#xff0c;写写别的 一眼就解密 一眼md5试一试 小小flag 拿下&#xff01; 解题感悟 30秒搞定

Python第三方包安装与配置教程

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、Windows系统下的Python包安装 二、Linux系统下的Python包安装 三、配置Python环境 四…

打印9*9乘法表(递归或压缩矩阵)python

打印9*9表def print_multiplication_table(row, col):if row > 10:return # 递归结束条件if col row:print() # 换行print_multiplication_table(row 1, 1) # 递归调用下一行else:print(f"{row-1} * {col} {(row-1) * col}\t", end"") # 打印乘法…

Top3专业课150满分,怎么考的?

这个系列会邀请上岸学长学姐进行经验分享~ 今天经验分享的同学是小马哥上海交大819的全程班学员&#xff0c;专业课150分满分&#xff0c;这位同学也是819期末考试的第一名&#xff0c;非常厉害&#xff01;大家吸吸欧气&#xff01; 初试成绩单 前言 先介绍下自己&#xff0…

mysql binlog统一恢复误删数据库、表、数据(没有任何备份)

先将mysql文件夹中的my.ini进行设置 在 [mysqld]下边加上 # mysql-bin 是日志的基本名或前缀名&#xff0c;最后生成的日志文件是mysql-bin.000001类似&#xff0c;重启mysql数字会递增 log_binmysql-bin #binlog格式&#xff0c;statement&#xff0c;row&#xff0c;mixed可…

慢性乙型肝炎肝脏剪切波弹性成像的深度学习放射学显著改善了肝纤维化的诊断性能 | 文献速递-深度学习结合影像组学

慢性乙型肝炎肝脏剪切波弹性成像的深度学习放射学显著改善了肝纤维化的诊断性能 | 文献速递-深度学习结合影像组学 麦田医学 美好事物中转站 2024-05-21 11:03 Title 题目 Deep learning Radiomics of shear wave elastography significantly improved diagnostic performa…

【linux-kernel内核移植记录-踩坑以及注意事项】

目录 1. 环境介绍2.编译原厂的kernel2.1 通过tftp挂载原厂linux内核 3. 修改对应的驱动3.1 修改CPU频率3.2 修改MMC3.3 修改网络驱动 4. 总结 1. 环境介绍 ubuntu版本16.04I.MX6ULL开发板&#xff0c;阿尔法uboot正常启动&#xff0c;能ping通ubuntu&#xff0c;可通过tftpboo…

【0007day】总体标准差、样本标准差和无偏估计

文章目录 总体标准差和样本标准差无偏估计无偏性与无偏估计量 总体标准差和样本标准差 一些表示上的差别。 总体标准差 样本标准差 两者的区别 样本方差为什么除以n-1? 这主要是由于样本的方差会低估总体的方差&#xff08;抽样的过程中&#xff0c;按照概率来说&#xff0…

C++面向对象的第二大特性:继承

1.继承的介绍 首先容我先向大家举一个列子: 我这里定义了一个Person的类 class Person { protected:string name;int age;string address;}; 在这个基础上&#xff0c;我要定义一个关于Student , Worker 的类 由于Student Worker都具有Person类中的成员变量 &#xff0c…

【C语言】指针(三)

目录 一、字符指针 1.1 ❥ 使用场景 1.2 ❥ 有关字符串笔试题 二、数组指针 2.1 ❥ 数组指针变量 2.2 ❥ 数组指针类型 2.3 ❥ 数组指针的初始化 三、数组指针的使用 3.1 ❥ 二维数组和数组名的理解 3.2 ❥ 二维数组传参 四、函数指针 4.1 ❥ 函数的地址 4.2 ❥ 函数…

探索亚马逊云科技技术课程:大模型平台与提示工程的应用与优化

上方图片源自亚马逊云科技【生成式 AI 精英速成计划】技术开发技能课程 前言 学习了亚马逊云科技–技术开发技能课程 本课程分为三个部分&#xff0c;了解如何使用大模型平台、如何训练与部署大模型及生成式AI产品应用与开发&#xff0c;了解各类服务的优势、功能、典型使用案…

借助 CloudFlare 增强站点内容保护防采集

今天在一位站长的帮助下实测了 CloudFlare 增强站点内容保护实现防采集的功能,效果那是杠杠的,如果您的站点原创内容比较多的话,明月强烈建议试试 CloudFlare 这个内容保护,无论是 WordPress 、Typecho 都有非常好的效果,并且几乎没有任何误伤,搜索引擎爬虫蜘蛛更是不会影…