C语言编程题_3D接雨水

接雨水的题目描述如下。

(1) 2D接雨水: 字节员工是不是个个都会接雨水 ;

(2) 3D接雨水: 407. 接雨水 II ;

(3) 3D接雨水: 字节人都会的 3D接雨水 。

  问题描述

  难度:困难

  给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。

  示例1:

  输入:heightMap = [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]];

  输出:4

  解释:下雨后,雨水将会上图蓝色的方块中。总的接雨水量为1+1+1=4。

  我找到的最好的思路是:把这个看成木桶接水,就像是短板理论。最外层一圈一定接不到水,也就是可以看成木桶的边缘,先把木桶的边缘都放进优先队列中,这时取出最小的柱子,向这个柱子的 4 个方向扩散,扩散出的柱子有两种情况,如果比当前柱子大,那么不能接水,如果比当前柱子小,那么接到的水就是当前柱子高度减去扩散柱子的高度(为什么?因为当前柱子一定是边缘最小的了,所以它一定能接到水),后面在把扩散的柱子加入到优先队列中,已经比较完的柱子就移出队列,这样就又形成了新的桶的边缘,并且水桶面积也在不断缩小(当然要记录走过的柱子,防止重复走),最终就会计算完成。

  下面是用C语言实现的3D接雨水:

#include <stdio.h>
#include <stdlib.h>#define Cols            (6)
#define Rows            (3)#define Status_ToDo     (0) // 待处理的。
#define Status_Done     (1) // 已处理的。
#define Status_Border   (2) // 作为木桶板。int addRainWaterOfTBLR(int height[][Cols], int status[][Cols], int minBorderHeight, int row, int col);void initStatus(int arr[][Cols]) {// // 注: 使用下面语句得到的rowCount为0, 因为arr作为形参的时候就会被当作一个指针。// int rowCount = sizeof(arr) / sizeof(arr[0]);for (int row = 0; row < Rows; row++) {for (int col = 0; col < Cols; col++) {if (0 == row || Rows-1 == row || 0 == col || Cols-1 == col) {arr[row][col] = Status_Border;} else {arr[row][col] = Status_ToDo;}}}// 去掉四个角。arr[0][0] = arr[0][Cols-1] = arr[Rows-1][0] = arr[Rows-1][Cols-1] = Status_Done;
}void showStatus(int height[][Cols], int status[][Cols]) {printf("打印状态:\n");for (int row = 0; row < Rows; row++) {for (int col = 0; col < Cols; col++) {printf("%d(%d), ", height[row][col], status[row][col]);}printf("\n");}
}void findPositionOfMinBorder(int height[][Cols], int status[][Cols], int result[2]) {// printf("findPositionOfMinBorder\n");result[0] = 0;result[1] = 0;for (int row = 0; row < Rows; row++) {for (int col = 0; col < Cols; col++) {if (Status_Border == status[row][col]&& ((0 == result[0] && 0 == result[1]) || height[row][col] < height[result[0]][result[1]])) {result[0] = row;result[1] = col;}}}printf("最小板的位置是(%d,%d)\n", result[0], result[1]);
}void repairBorder(int status[][Cols]) {for (int row = 0; row < Rows; row++) {for (int col = 0; col < Cols; col++) {if (Status_Border == status[row][col]) {//上下左右都不是待处理的。if ((0 == row || (row > 0 && status[row-1][col] != Status_ToDo))&& (Rows-1 == row || (Rows-1 > row && status[row+1][col] != Status_ToDo))&& (0 == col || (col > 0 && status[row][col-1] != Status_ToDo))&& (Cols-1 == col || (Cols-1 > col && status[row][col+1] != Status_ToDo))) {status[row][col] = Status_Done;}}}}
}int addRainWaterAtPosition(int height[][Cols], int status[][Cols], int minBorderHeight, int row, int col) {int result = 0;// printf("addRainWaterAtPosition(%d,%d)\n", row, col);if (height[row][col] <= minBorderHeight) {result += (minBorderHeight - height[row][col]);result += addRainWaterOfTBLR(height, status, minBorderHeight, row, col);} else {status[row][col] = Status_Border;}return result;
}int addRainWaterOfTBLR(int height[][Cols], int status[][Cols], int minBorderHeight, int row, int col) {int result = 0;// printf("addRainWaterOfTBLR(%d,%d)\n", row, col);status[row][col] = Status_Done;if (row > 0 && Status_ToDo == status[row-1][col]) { // 上。result += addRainWaterAtPosition(height, status, minBorderHeight, row-1, col);}if (row < Rows-1 && Status_ToDo == status[row+1][col]) { // 下。result += addRainWaterAtPosition(height, status, minBorderHeight, row+1, col);}if (col > 0 && Status_ToDo == status[row][col-1]) { // 左。result += addRainWaterAtPosition(height, status, minBorderHeight, row, col-1);}if (col < Cols-1 && Status_ToDo == status[row][col+1]) { // 右。result += addRainWaterAtPosition(height, status, minBorderHeight, row, col+1);}return result;
}// 判断完成。
int checkFinish(int status[][Cols]) {for (int row = 0; row < Rows; row++) {for (int col = 0; col < Cols; col++) {if (Status_ToDo == status[row][col]) {return 0;}}}return 1;
}// 简介:  3D接雨水。
int main(void)
{int rainWater = 0;int heightMap[][Cols] = {{1,4,3,1,3,2},{3,2,1,3,2,4},{2,3,3,2,3,1}};// printf("heightMap_rowCount = %d。\n", sizeof(heightMap) / sizeof(heightMap[0]));int (*status)[Cols] = malloc(sizeof(int) * (sizeof(heightMap) / sizeof(heightMap[0])) * Cols);initStatus(status);showStatus(heightMap, status);while(!checkFinish(status)) {int positionOfMinBorder[2] = {0, 0};findPositionOfMinBorder(heightMap, status, positionOfMinBorder);int minBorderHeight = heightMap[positionOfMinBorder[0]][positionOfMinBorder[1]];// printf("minBorderHeight=%d\n", minBorderHeight);rainWater += addRainWaterOfTBLR(heightMap, status, minBorderHeight, positionOfMinBorder[0], positionOfMinBorder[1]);repairBorder(status);showStatus(heightMap, status);}printf("总的接雨水量为%d\n", rainWater);free(status);printf("程序正常退出。\n");return 0;
}

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

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

相关文章

从零开始精通RTSP之深入理解RTP包

概述 RTP包是用于在互联网上传输实时音视频&#xff0c;或其他类型时间敏感数据的标准数据包格式。它是多媒体通信领域中的核心组件&#xff0c;尤其在实时流媒体应用&#xff08;比如&#xff1a;视频会议、在线直播、IP电话、安防监控等&#xff09;中扮演着至关重要的角色。…

uniapp配置了pages.json 的 tabbar 国际化,小程序切换语言没有实时切换

如上图&#xff0c;按照uniapp官方文档配置了tabbar的国际化 但是微信小程序实时切换语言没有实时刷新 解决方案&#xff1a; 在App.vue中加入以下代码&#xff1a; 在onLaunch中执行方法即可

DevOps(十二)Jenkins实战之Web发布到远程服务器

前面两篇博文介绍了怎么将django开发的web应用推送到gitlab源码仓库&#xff0c;然后jenkins服务器从gitlab仓库拉下来&#xff0c;布署到jenkins服务器上&#xff0c;并用supervisor进行进程管理&#xff0c;保证web应用一直能正常运行&#xff0c;今天我们继续优化&#xff0…

云原生Kubernetes: K8S 1.29版本 部署ingress-nginx

目录 一、实验 1.环境 2. K8S 1.29版本 部署ingress-nginx 二、问题 1.kubectl 如何强制删除 Pod、Namespace 资源 2.创建pod失败 3.pod报错ImagePullBackOff 4.docker如何将镜像上传到官方仓库 5.创建ingress报错 一、实验 1.环境 &#xff08;1&#xff09;主机 表…

学习指导|在改变

备忘在这里啦。潦草本草

css中新型的边框设置属性border-inline

一、概念与背景 border-inline 是 CSS Logical Properties and Values 模块中的一个属性&#xff0c;用于控制元素在流内&#xff08;inline&#xff09;方向上的边框。该模块旨在提供与书写模式&#xff08;writing mode&#xff09;无关的布局和样式描述方式&#xff0c;使得…

JS中的循环结构[for,while,do while]结构分析及实例讲解。流程控制语句[break和continue]分析及讲解

循环结构分析及示例 for循环 for循环是一种基于计数器的循环&#xff0c;允许自定义循环的初始化、条件和迭代步骤。 语法: for (初始化表达式&#xff1b;测试表达式&#xff1b;更新表达式){ // 循环体 } 初始化表达式&#xff1a;在循环开始前执行一次&#xff0c;通常用…

【1429】招生管理管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 招生管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

内蒙古自治区工程系列生态环境专业技术人才职称评审条件

内蒙古自治区工程系列生态环境专业技术人才职称评审条件链接关于印发《内蒙古自治区工程系列生态环境专业技术人才职称评审条件》的通知_内蒙古自治区人民政府类别基本条件业绩成果备注助理工程师1.具备硕士学位或第二学士学位&#xff1b;2.具备大学本科学历或学士学位&#x…

2024年新算法-鹦鹉优化器(PO)优化BP神经网络回归预测

2024年新算法-鹦鹉优化器(PO)优化BP神经网络回归预测 亮点&#xff1a; 输出多个评价指标&#xff1a;R2&#xff0c;RMSE&#xff0c;MSE&#xff0c;MAPE和MAE 满足需求&#xff0c;分开运行和对比的都有对应的主函数&#xff1a;main_BP, main_PO, main_BPvsBP_PO&#x…

LeetCode 题目 66:加一【python5种算法实现】

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

抖音 小程序 获取手机号 报错 getPhoneNumber:fail auth deny

这是因为 当前小程序没有获取 手机号的 权限 此能力仅支持小程序通过试运营期后可用&#xff0c;默认获取权限&#xff0c;无需申请&#xff1b; https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/guide/open-capabilities/acquire-phone-number-acqu…

Redis入门到通关之Redis网络模型-用户空间和内核态空间

文章目录 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端开发者。 博客特色&#xff1a; 在我的…

DevOps(十三)Jenkins之Selenium插件配置

一、Selenium Grid详细介绍 Selenium Grid 是 Selenium 测试套件的一部分&#xff0c;主要用于通过并行执行测试来提高测试执行的速度和效率。它允许您在多个环境&#xff08;不同的浏览器和操作系统&#xff09;上同时运行测试&#xff0c;从而帮助在开发过程中快速发现跨浏览…

Github 2024-04-25Go开源项目日报Top10

根据Github Trendings的统计,今日(2024-04-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Vue项目1Go编程语言:构建简单、可靠和高效的软件 创建周期:3474 天开发语言:Go协议类型:BSD 3-Clause “New” or “Revised” Lic…

spark3.0.0单机模式安装

注&#xff1a;此安装教程基于hadoop3集群版本 下载安装包 下载spark3.0.0版本&#xff0c;hadoop和spark版本要对应&#xff0c;否则会不兼容 用xftp上传Linux虚拟机&#xff0c;上传目录/bigdata&#xff08;可修改&#xff09; 解压 tar -zxvf /bigdata/spark-3.0.0-bin-h…

背包问题汇总

本文涉及知识点 动态规划汇总 状态机dp 01背包 有n件物品&#xff0c;体积分别是v[i]&#xff0c;价值分别是w[i]&#xff0c;有个包的容积是bv。如何选择物品使得&#xff0c;在总体积不超过vb的前提下&#xff0c;让总价值最大。 动态规划的状态表示 dp[i][j] 表示处理完…

go垃圾回收机制

Go 语言的垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制是其内存管理的核心部分&#xff0c;它负责自动检测并回收不再使用的内存。Go 的垃圾回收机制可以分为以下几个主要类别&#xff1a; 1. 标记&#xff08;Mark&#xff09; 根节点&#xff1a;垃圾回收从…

适用于WPF模式开发的主题和控件库Material Design

简介: MaterialDesignInXamlToolkit 是一个开源的 GUI 库,它提供了 Google Material Design 风格的 GUI 元素,可以在 .NET Framework 和 .NET Core 上使用。它的目的是帮助 .NET 开发人员快速构建具有现代化外观的应用程序。 MaterialDesignInXamlToolkit 包含了许多常用的…

CentOS 7.9.2009 中 Docker 使用 GPU

一、安装nvidia驱动 1.1&#xff0c;查看显卡驱动 # 查看显卡型号 lspci | grep -i nvidia 1.2&#xff0c;进入 PCI devices &#xff0c;输入上一步查询到的 2204 1.3&#xff0c;进入 官方驱动 | NVIDIA&#xff0c;查询 Geforce RTX 3090 驱动并下载 1.4&#xff0c;禁用…