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,一经查实,立即删除!

相关文章

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;使得…

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

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

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…

抖音 小程序 获取手机号 报错 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] 表示处理完…

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;禁用…

冯老师降维打击申论课

冯老师降维打击申论课&#xff0c;以其独到的见解和精湛的教学技巧&#xff0c;将复杂的申论知识变得简单易懂。通过深入浅出的讲解&#xff0c;帮助考生迅速掌握申论精髓&#xff0c;轻松应对考试。课程内容丰富实用&#xff0c;深受考生好评&#xff0c;是备考申论的不二之选…

【SQL代理中转注入】对DVWA登录界面username字段实施注入

一、实验过程 步骤0&#xff1a;注释掉相关username防护&#xff0c;截图如下&#xff1a; 以DVWA为攻击目标&#xff0c;将login.php中第21、22行注释掉 步骤1&#xff1a;源码分析&#xff0c;截图如下&#xff1a; 如此可知&#xff0c;首先需要通过token验证&#xff0c;然…

CTFHub(web sql)(四)

Cookie注入 Cookie 注入的原理也和其他注入一样&#xff0c;只不过是将提交的参数已 Cookie 方式提交&#xff0c;而一般的注入是使用 GET 或者 POST 方式提交&#xff0c;GET 方式提交就是直接在网址后面加上需要注入的语句&#xff0c;POST 方式则是通过表单&#xff0c;GET …

feign整合sentinel做降级知识点

1&#xff0c;配置依赖 <!-- Feign远程调用依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> <!--sentinel--><dependency>…

【数据结构(邓俊辉)学习笔记】向量04——有序向量

文章目录 0.概述1.比较器2.有序性甄别3.唯一化3.1低效算法3.1.1实现3.1.2 复杂度3.1.3 改进思路3.2 高效算法3.2.1 实现3.2.2 复杂度 4.查找4.1统一接口4.2 语义定义4.3 二分查找4.3.1 原理4.3.2 实现4.3.3 复杂度4.3.4 查找长度4.3.5 不足 4.4 Fibonacci查找4.4.1 思路及原理4…

【03-掌握Scikit-learn:深入机器学习的实用技术】

文章目录 前言数据预处理缺失值处理数据缩放特征选择模型训练参数调整模型评估总结前言 经过了对Python和Scikit-learn的基础安装及简单应用,我们现在将更深入地探究Scikit-learn的实用技术,以进一步提升我们的数据科学技能。在本文中,我们将涵盖数据预处理、特征选择、模型…