图论学习 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()));

    // 如果所有排列都不能放入,返回false
    return false;
}

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

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

相关文章

JavaScript:实现内容显示隐藏(展开收起)功能

一、场景 点击按钮将部分内容隐藏&#xff08;收起&#xff09;&#xff0c;再点击按钮时将内容显示&#xff08;展开&#xff09;出来。 二、技术摘要 js实现实现内容显示隐藏js动态给ul标签添加li标签js遍历数组 三、效果图 四、代码 js_block_none.js代码 var group1 doc…

MySQL高级-SQL优化-小结

文章目录 1、insert 优化2、主键优化3、order by 优化4、group by 优化5、limit 优化6、count 优化7、update 优化 1、insert 优化 insert&#xff1a;批量插入、手动控制事务、主键顺序插入 大批量插入&#xff1a;load data local infile 2、主键优化 主键长度尽量短、顺序插…

webpack【实用教程】

基础配置 配置的拆分和合并 通常 webpack 的配置文件会有3个 webpack.common.js 公共配置&#xff08;会被另外两个配置文件导入并合并&#xff09;webpack.dev.js 开发环境的配置webpack.prod.js 生产环境的配置 开发环境的本地服务 在 webpack.dev.js 中配置 devServer:…

探索未来的AI革命:GPT-5的即将登场

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

柔性数组(flexible array)

柔性数组从C99开始支持使用 1.柔性数组的概念 概念&#xff1a; 结构体中&#xff0c;结构体最后一个元素允许是未知大小的数组&#xff0c;这就叫[柔性数组]的成员 struct S {int n;char arr[]; //数组大小未知(柔性数组成员) }; 柔性数组的特点&#xff1a; 结构体中柔性…

右键新建没有TXT文本文档的解决办法

电脑右键新建&#xff0c;发现没有txt了&#xff0c;我查网上办法都有点复杂&#xff0c;诸如注册表的&#xff0c;但是其实很简单&#xff0c;重启windows资源管理器就可以了。 点击重新启动&#xff0c;之后新建就有txt文档了。

Windows server 由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开。

问题现象&#xff1a; 解决办法 临时远程方式1: 打开 mstsc 时带上 /admin 等参数&#xff0c;如下图所示&#xff1a; 使用“mstsc /admin /v:目标ip”来强制登录服务器&#xff0c;但只能是管理员身份。 远程方式2&#xff1a; 通过VM远程登陆系统后&#xff0c;运行输入R…

安卓速度下载v1.0.5/聚合短视频解析下载

功能特色 短视频下载与高级管理 – 支持短视频下载&#xff0c;为您提供一系列高级视频管理功能包括视频内容提取、智能防重复技术、视频体积压缩以及视频转换成GIF图片等&#xff1b; 磁-力链接下载升级 – 现支持磁力链接下载&#xff0c;实现边下载边播放的便捷体验&#x…

LLaMA2模型训练加速秘籍:700亿参数效率提升195%!

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID &#xff5c; 计算机视觉研究院 学习群 &#xff5c; 扫码在主页获取加入方式 开源地址&#xff1a;https://github.com/hpcaitech/ColossalAI 计算机视觉研究院专栏 Column of Computer Vision Ins…

【深度学习】服务器炼丹代码配置、Python使用指定gpu显卡运行代码

【显卡】服务器炼丹代码配置 写在最前面一、查看哪几块显卡能用二、使用指定gpu运行代码1、指定使用GPU0运行脚本&#xff08;默认是第一张显卡, 0代表第一张显卡的id,其他的以此类推&#xff09;2、指定使用多张显卡运行脚本 三、如何使用1、单块显卡使用2、多GPU训练使用Data…

亚太杯赛题思路发布(中文版)

导读&#xff1a; 本文将继续修炼回归模型算法&#xff0c;并总结了一些常用的除线性回归模型之外的模型&#xff0c;其中包括一些单模型及集成学习器。 保序回归、多项式回归、多输出回归、多输出K近邻回归、决策树回归、多输出决策树回归、AdaBoost回归、梯度提升决策树回归…

javaSE知识点整理总结(上)

目录 一、面向对象 1. 类、对象、方法 2.面向对象三大特征 &#xff08;1&#xff09;封装 &#xff08;2&#xff09;继承 &#xff08;3&#xff09;多态 二、常用类 1.Object类 2.Array类 3.基本数据类型包装类 4.String类 5.StringBuffer类 6.Math类 7.Random…

ONLYOFFICE 8.1 桌面编辑器测评:引领数字化办公新潮流

目录 前言 下载安装 新功能概述 1.PDF 编辑器的改进 2. 演示文稿中的幻灯片版式 3.语言支持的改进 4. 隐藏“连接到云”板块 5. 页面颜色设置和配色方案 界面设计&#xff1a;简洁大方&#xff0c;操作便捷 性能评测&#xff1a;稳定流畅&#xff0c;高效运行 办公环…

恭喜!Apache SeaTunnel2024开源之夏学生中选名单出炉!

经过严格的筛选&#xff0c;开源之夏组委会及导师已经选出并录取项目对应的学生&#xff0c;社区联合中科院开展的开源之夏活动也进入到了激动人心的中选公示阶段。 在这里&#xff0c;我们恭喜下面的同学&#xff0c;已成功匹配到Apache SeaTunnel社区的项目&#xff0c;即将开…

主从复制、哨兵以及Cluster集群

目录 1.Redis高可用 2.Redis主从复制 2.1 主从复制的作用 2.2 主从复制流程 2.3 搭建Redis主从复制 2.3.1 修改Redis配置文件&#xff08;Master节点操作&#xff09; 2.3.2 修改Redis配置文件&#xff08;Slave节点操作&#xff09; 2.3.2 验证主从复制结果 3.Redis哨…

数据分析三剑客-Matplotlib

数据分析三剑客 数据分析三剑客通常指的是在Python数据分析领域中&#xff0c;三个非常重要的工具和库&#xff1a;Pandas、NumPy和Matplotlib。Pandas主要负责数据处理和分析&#xff0c;NumPy专注于数值计算和数学运算&#xff0c;而Matplotlib则负责数据可视化。这三个库相…

聊聊啥项目适合做自动化测试

作为测试从业者&#xff0c;你是否遇到过这样的场景&#xff0c;某天公司大Boss找你谈话。 老板&#xff1a;小李&#xff0c;最近工作辛苦了 小李&#xff1a;常感谢您的认可&#xff0c;这不仅是对我个人的鼓励&#xff0c;更是对我们整个团队努力的认可。我们的成果离不开每…

【python】一篇文零基础到入门:快来玩吧~

本笔记材料源于&#xff1a; PyCharm | 创建你的第一个项目_哔哩哔哩_bilibili Python 语法及入门 &#xff08;超全超详细&#xff09; 专为Python零基础 一篇博客让你完全掌握Python语法-CSDN博客 0为什么安装python和pycharm&#xff1f; 不同于c&#xff0c;c&#xff0…

NFT Insider #136:韩国将为NFT市场带来严格监管,The Sandbox DAO举办Twitter Space AMA

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members &#xff08;https://twitter.com/WHALEMembers&#xff09;、BeepCrypto &#xff08;https://twitter.com/beep_crypto&#xff09;联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜…

已解决javax.transaction.InvalidTransactionException:事务无效的正确解决方法,亲测有效!!!

已解决javax.transaction.InvalidTransactionException&#xff1a;事务无效的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 1. 确保事务的正确启动和结束 Spring中的事务管理 2. 避免嵌套事务问题…