图论学习 c++长方体嵌套问题

一个长,宽,高为X1,X2,X3的长方体之中算法可以存放一个长,宽,高Y1,Y2,Y3的长方体。备注两个长方体都可以旋转,下面是一个C++程序,用于确定一个长方体是否可以放入另一个长方体中(备注:没有考虑全部情况),正确答案在第二段代码:

#include <iostream>
#include <algorithm>
#include <array>// 函数声明
bool canFit(std::array<int, 3>& container, std::array<int, 3>& box);int main() {// 定义容器(外部长方体)的尺寸std::array<int, 3> container;std::cout << "Enter container dimensions (length width height): ";std::cin >> container[0] >> container[1] >> container[2];// 定义要放入的盒子(内部长方体)的尺寸std::array<int, 3> box;std::cout << "Enter box dimensions (length width height): ";std::cin >> box[0] >> box[1] >> box[2];// 检查盒子是否可以放入容器if (canFit(container, box)) {std::cout << "The box can fit into the container." << std::endl;} else {std::cout << "The box cannot fit into the container." << std::endl;}return 0;
}bool canFit(std::array<int, 3>& container, std::array<int, 3>& box) {// 对容器尺寸进行排序,从小到大std::sort(container.begin(), container.end());// 对盒子尺寸进行排序,从小到大std::sort(box.begin(), box.end());// 检查每个维度,盒子的尺寸是否小于等于容器的尺寸// 这里我们只需要检查排序后的对应维度,因为已经考虑了所有可能的旋转for (int i = 0; i < 3; ++i) {if (box[i] > container[i]) {return false;}}// 如果所有维度都符合要求,则盒子可以放入容器return true;
}

通过对尺寸进行排序,我们不需要显式地考虑所有可能的旋转。排序确保了我们总是在比较最小对最小,中等对中等,最大对最大的尺寸。如果这些配对都满足条件,那么就一定存在一种旋转方式使得盒子可以放入容器。

这个解决方案的时间复杂度是O(1),因为我们只处理固定数量(3个)的元素。空间复杂度也是O(1),因为我们使用的额外空间不随输入大小变化。

但是,请注意,长方体的长宽高是可以旋转的,当X1小于Y1,X2小于Y2,X3小于Y3时,两个长方体固然可以嵌套,但是如果X2小于Y1,X1小于Y2, X3小于Y3,他们依旧可以互相嵌套。

下面这个新版本的程序考虑了长方体所有可能的旋转情况。让我解释一下主要的变化:

  1. canFit 函数现在使用 const 引用来接收参数,因为我们不会修改原始数组。
  2. canFit 函数中,我们创建了一个 boxPermutation 数组来存储盒子尺寸的所有可能排列。
  3. 我们使用 std::next_permutation 函数来生成盒子尺寸的所有可能排列。这个函数会自动生成下一个字典序的排列。
  4. 对于每一种排列,我们检查是否可以放入容器。如果盒子的每个维度都小于或等于容器的对应维度,那么这种排列是可行的。
  5. 如果找到任何一种可行的排列,函数就返回 true
  6. 如果遍历完所有可能的排列都没有找到可行的方案,函数返回 false

这个新的实现考虑了长方体所有可能的旋转情况,包括您提到的例子(X2小于Y1,X1小于Y2,X3小于Y3)。它会检查盒子尺寸的所有6种可能排列(3!=6),确保不会遗漏任何可能的放置方式。

这个算法的时间复杂度是O(1),因为我们总是处理固定数量(3个)的元素,尽管我们检查了所有排列。空间复杂度也是O(1)。

#include <iostream>
#include <array>
#include <algorithm>// 函数声明
bool canFit(const std::array<int, 3>& container, const std::array<int, 3>& box);int main() {// 定义容器(外部长方体)的尺寸std::array<int, 3> container;std::cout << "Enter container dimensions (length width height): ";std::cin >> container[0] >> container[1] >> container[2];// 定义要放入的盒子(内部长方体)的尺寸std::array<int, 3> box;std::cout << "Enter box dimensions (length width height): ";std::cin >> box[0] >> box[1] >> box[2];// 检查盒子是否可以放入容器if (canFit(container, box)) {std::cout << "The box can fit into the container." << std::endl;} else {std::cout << "The box cannot fit into the container." << std::endl;}return 0;
}bool canFit(const std::array<int, 3>& container, const std::array<int, 3>& box) {// 创建一个数组来存储盒子的所有可能排列std::array<int, 3> boxPermutation = box;// 使用do-while循环来生成所有可能的排列do {// 检查当前排列是否可以放入容器if (boxPermutation[0] <= container[0] &&boxPermutation[1] <= container[1] &&boxPermutation[2] <= container[2]) {return true;}} while (std::next_permutation(boxPermutation.begin(), boxPermutation.end()));// 如果所有排列都不能放入,返回falsereturn false;
}

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

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

相关文章

Cython编译报错“numpy/arrayobject.h: No such file or directory”解决方案

问题背景 Cython是用来加速Python程序性能的一个工具&#xff0c;其基本使用逻辑就是将类Python代码(*.pyx扩展格式)编译成\(*.c,*.so\)动态链接库文件&#xff0c;然后就可以在正常的Python脚本文件中调用动态链接库的内部函数。编译过程中因为会去索引一些头文件&#xff0c;…

【操作与配置】WSL配置LINUX

WSL2&#xff08;Windows Subsystem for Linux 2&#xff09;是Microsoft开发的一项技术&#xff0c;允许用户在Windows操作系统上运行Linux发行版。WSL2是WSL&#xff08;Windows Subsystem for Linux&#xff09;的第二版&#xff0c;带来了许多改进和新特性。 官网&#xff…

EXCEL 复制后转置粘贴

nodepad 转置参考&#xff1a; https://editor.csdn.net/md/?articleId140014651 1. WPS复制后转置粘贴 复制-》右键-》顶部第一行-》粘贴行列转置&#xff0c;如下图&#xff1a; 2. Excel office365 本地版 2. Excel office365 在线版

涨知识!推荐6个非常好用的App!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/我从 50 个应用程序中选出了 6 个超级实用的应用程序。 每款应用程序都是最核心、最有益的知识提升工具&#xff01;每天打开它们&#xff0c;提神…

Shell 脚本编程保姆级教程(上)

一、运行第一个 Shell 脚本 1.1 Shell 脚本 Shell 脚本&#xff08;shell script&#xff09;&#xff0c;是一种为 shell 编写的脚本程序。 业界所说的 shell 通常都是指 shell 脚本&#xff0c;但读者朋友要知道&#xff0c;shell 和 shell script 是两个不同的概念。 由…

PS的图片切图

这个功能呢是在一个图片中取出你想用的图标或图片。 我们首先下载一个PS工具&#xff1a; 然后打开应用&#xff0c; 在左侧有个一切片工具&#xff0c;我们左键选中他&#xff0c; 然后就可以在你的图片里进行划区域选取你所要选取的图片了&#xff0c; 当你选取完之后点击文…

多通道采集器采样接口设计[进行中...]

1.技术问题 这是一个非常小的设计&#xff0c;完全不值得把它展示出来。但是因为这个接口设计关系到一些细微的配置和技术限制&#xff0c;仍然有一些细节需要处理&#xff0c;并且很容易出错&#xff0c;我们先把技术问题罗列一下&#xff1a; 多个传感器对应的多个逻辑通道…

Servlet工作原理

Servlet 工作原理 编写Servlet 创建servlet 创建一个MyServlet继承HttpServlet&#xff0c;重写doGet和doPost方法&#xff0c;也就是看请求的方式是get还是post&#xff0c;然后用不同的处理方式来处理请求&#xff0c; 2. 配置Servlet //添加参数 <servlet><se…

使用巴比达内网穿透搭建本地Web项目访问环境【免费方案】

你是否曾经遇到过这样的问题&#xff1a;你的服务器或者个人电脑处于内网环境中&#xff0c;无法直接通过公网IP进行访问&#xff1f;今天我要向大家推荐一款神器——巴比达内网穿透工具&#xff0c;帮助你轻松搭建SpringBoot的web外网访问环境&#xff01; 巴比达内网穿透是一…

浅谈API生态建设:API安全策略的6项原则

API作为连接系统与应用的桥梁&#xff0c;在助力实现高效业务流程的同时&#xff0c;也不可避免出现资产管理困难、敏感数据泄漏风险骤增等安全问题。前段时间&#xff0c;安全公司Fastly公布了一项重磅调查报告&#xff0c;报告中显示95%的企业在过去1年中遭遇过API安全问题。…

数据脱敏学习

数据脱敏是一种保护敏感信息的方法&#xff0c;它通过修改或删除数据中的敏感部分&#xff0c;使得数据在保持一定可用性的同时&#xff0c;不再直接关联到个人隐私或重要信息。 自然人指可以直接或间接标识 直接标识&#xff1a;如姓名、身份证号码、家庭住址、电话号码、电…

容器:string

以下是对于string容器常用功能和函数的总结 主要包括 1、定义string 2、字符串赋值 3、字符串拼接&#xff1a;str.append() 4、字符串查找&#xff1a;str.find() / str.rfind() 5、字符串替换&#xff1a;str.replace(&#xff09; 6、字符串长度比较&#xff1a;str.compare…

springboot多数据源应用,A服务依赖于B服务jar包,A服务和B服务业务数据分别入自己的库如何做?

上一节我们简单阐述了springboot多数据源如何配置。在实际的业务场景中我们常常遇到A服务依赖于B服务jar包&#xff0c;A服务和B服务业务数据分别入自己的库中。为何要这么做呢&#xff1f;比如B服务是日志SDK&#xff0c;A服务集成B服务来实现记录日志的功能&#xff0c;但是日…

无人机飞行操作技巧

要想充分利用无人机&#xff0c;掌握其操作技巧非常关键。以下是一些基础而重要的无人机操作技巧&#xff0c;可以帮助你更安全、更有效地使用无人机。 扫描式拍摄&#xff1a;这种方法涉及慢慢地将无人机从一个点移动到另一个点&#xff0c;同时保持相机对准一个特定的主题。…

Java基础知识-集合类

1、HashMap 和 Hashtable 的区别&#xff1f; HashMap 和 Hashtable是Map接口的实现类&#xff0c;它们大体有一下几个区别&#xff1a; 1. 继承的父类不同。HashMap是继承自AbstractMap类&#xff0c;而HashTable是继承自Dictionary类。 2. 线程安全性不同。Hashtable 中的方…

大数据学习之分布式数据采集系统Flume学习

分布式数据采集系统Flume学习 一、Flume架构 1.1 Hadoop业务开发流程 1.2 Flume概述 flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。 支持在日志系统中定制各类数据发送方&#xff0c;用于收集数据; 同时&#xff0c;Flume提供对数据进行简单处理&…

用英文介绍开罗:Cairo, Egypt‘s MEGACITY

Cairo, Egypt’s MEGACITY: Largest City in the Middle East Link: https://www.youtube.com/watch?v0tKphKvodLQ&listPLmSQiOQJmbZ7TU39cyx7gizM9i8nOuZXy&index23 Summary Summary of the Mini-Documentary on Cairo Historical and Cultural Significance Cai…

从零开始学习Linux(10)----动静态库

目录 1.制作静态库 1.编写源代码 2.编译 3.打包库 4.使用库 2.制作动态库 1.编译 2.打包库 3.总结 3.理解动态库加载 1.站在系统角度理解 2.谈谈编址&#xff0c;可执行程序 1.制作静态库 1.编写源代码 假设你编写了两个源代码文件mymath.c和myprintf.c以及它们对应…

乐队谱在哪里找 乐队功能谱怎么做 Guitar Pro8激活码 吉他谱软件

学习乐队谱对于音乐爱好者来说是一种极具乐趣和挑战的体验。无论是追溯经典曲目还是与其他乐手合作&#xff0c;乐队谱都是实现音乐梦想的必备工具。然而&#xff0c;要找到适合练习的乐队谱并制作出符合乐队演奏需求的功能谱并不容易&#xff0c;需要借助一些方法和工具。下面…

java根据cron表达式获取上次或者下次执行时间(考虑每月天数)

** 一 cron 表达式相关 例如[0 0 0 1 * ?,59 59 23 L * ?]每月1日凌晨开启&#xff0c;每月月末23点59分59秒结束 先获取每次执行间隔差值,然后模拟一次一次触发&#xff0c;找到应该触发的时间点 ** 获取上次执行时间 /*** 上次执行时间* param cronInfo* return*/ publi…