描述:

给定一个高度为 2000mm 的柜子空间,以及 n 个层板距离柜子底部高度,满足移动层板位置 使得层板等分衣柜的空间。计算所有移动层板的顺序。 层板号自下向上依次排列,1,2..n。层板需要考虑空间位置,不能跨层板移动

给出以下示例:

示例 1

输入:n = 3,zs = 50,60,1000

输出:

3 2 1

示例 2

输入:n = 4,zs = 50,600,700,1000

输出:

1,4,3,2

4,1,3,2

4,3,1,2

4,3,2,1

提示 1:1 <= n <= 10

提示 2:输出结果需要按小到大排

思路:

简单书写思路

思路1:枚举所有可能,依次派出,剩下的即为答案.(未使用)

思路2:使用多叉树进行存储数据,之后使用dfs(深度优先搜索)整理答案.(本帖使用)

思路3:对板号进行划分格子,如在格子最后使用全排列进行整理答案(未使用).

实际代码

对于示例1\示例2代码可以正确输入输出结果,其他测试用例未知.

具体思路,建立多叉树(二叉树形式),首先对于所有层板进行判断,对于可以移动的层板号码小的为初始节点的子节点,号码较大的层板为子节点的兄弟节点,代表可以不让小号层板先移动,转而让大号层板先移动,子节点则为下一次可以移动的层板.

对于输出:使用向量存储数据,同时用栈进行深度优先搜索,对于每一次的搜索结果存入向量,并找出兄弟节点,再次进行dfs.最后格式化输出vector.

#include<iostream>
#include<stack>
#include <vector>
using namespace std;
typedef struct node {int data;struct node* son, * bro;
}Node ;
Node* start(int* a,int n);
vector<int> showNode(Node* node);
Node* createson( int* a, int n);
Node* createbro( int* a, int n, int j);Node* createbro( int* a, int n, int j)
{//建立兄弟节点Node *s= new Node ;//node = p;s->data = NULL;s->bro = s->son = NULL;//n为多叉树的层数for (; j <= n; j++) {if (a[j + 1] > (2000 / (n + 1) * j) && a[j] < (2000 / (n + 1) * j)){int b[15] = { 0 };for (int i = 0; i < n + 2; i++)b[i] = a[i];b[j] = (2000 / (n + 1) * j);s->data = j;s->son = createson( b, n);if (j == n)return s;//如果相等 也就是最后一位则跳出说明没有兄弟节点 s->bro = createbro( a, n, j+1);return s;}}return s;
}Node* createson( int* a, int n)
{//建立子节点Node* s = new Node;s->data = NULL;s->bro = s->son = NULL;//n为多叉树的层数for (int j = 1; j <= n; j++){//遍历判断是否为兄弟结点if (a[j + 1] > (2000 / (n + 1) * j) && a[j] < (2000 / (n + 1) * j)){int b[15] = { 0 };for (int i = 0; i < n + 2; i++)b[i] = a[i];b[j] = (2000 / (n + 1) * j);s->data = j;s->son = createson( b, n);if (j == n)return s;//如果相等 也就是最后一位 则跳出说明没有兄弟节点 //node->bro = node;s->bro = createbro( a, n, j+1);//cout << "1";break;}}return s;
}Node* start(int* a, int n) {//a是层板距离 ,n是层板数,也是多叉树的层数Node* root=new Node;root->data = 0;Node* p = new Node;root->son=p;p->bro = p->son = NULL;//n为多叉树的层数for (int j = 1; j <= n; j++)//遍历判断是否为兄弟结点if (a[j + 1] > (2000 / (n + 1) * j) && a[j] < (2000 / (n + 1) * j)){int b[15] = { 0 };for (int i = 0; i < n+2; i++)b[i] = a[i];b[j] = (2000 / (n + 1) * j);p->data = j;p->son = createson(b,n);if (j == n)break; //如果相等 也就是最后一位 则跳出说明没有兄弟节点 p->bro = createbro( a, n, j+1);break;}return root;
}vector<int> showNode(Node* node)
{//使用vector存储,维护vector vector里即为答案//深度遍历vector<int>v;stack<Node*> s;stack<Node*>s2;s.push(node);while (!s.empty()) {Node* treeNode = s.top();if (treeNode->son->data) { s.push(treeNode->son); }else{while (!s.empty()) {s2.push(s.top());s.pop();}while (!s2.empty()) {v.push_back(s2.top()->data);s.push(s2.top());s2.pop();}while (!treeNode->bro->data ) { s.pop();treeNode = s.top();if (treeNode->bro == NULL) {s.pop();break; }}if (!s.empty()) {treeNode = s.top();s.pop();s.push(treeNode->bro);}}}return v;}int main()
{/*//数据输入int n;cin >> n;int a[15] = { 0 };for (int i = 1; i <= n; i++){cin >> a[i];}a[n+1] = 2000;//多叉树方法,遍历时判断 哪几个可以移动,形成节点,最后遍历输出节点. 觉得这个方法可以用*///从1开始存储,不从0开始int a[5] = { 0,50,60,1000,2000 };//int a[6] = { 0,50,600,700,1000,2000 };int n = 3;Node *root = start(a, n);vector <int>  v=showNode(root->son);//格式化输出int q = 0;for (int i = 0; i < v.size(); i++){cout << v[i];q++;if (q == n) { cout << "\n"; q = 0; }else cout << ",";}return 0;
}

如果代码有问题,请在评论区提问.答案纯原创,转载请说明!

层板等分衣柜(C++)相关推荐

  1. 可编程led灯带原理_88张图搞定层板灯带的设计、安装、收口及检修!

    dop设计(ID:dopdesign)原创 作者丨泽顺 编辑丨那兰 "光之于空间,犹如空气之于生命" 光的存在赋予了空间生命和灵魂.无论是建筑空间还是室内装饰设计,光都是设计当中必 ...

  2. 4层板到12层板叠层经典设计方案

    目录 1.4层板优选叠层方案 2.6层板优选叠层方案 3.8层板优选叠层方案 4.10层板优选叠层方案 5.12层板优选叠层方案 6.总结 电路板的叠层设计是对PCB的整个系统设计的基础,叠层设计若有 ...

  3. pcb 假八层_八层板的成本却只六层的性能,PCB设计遭遇假八层该怎么办?

    在<PCB的筋骨皮>一文中,我们提出了当板厚在1.6mm及以上时,怎样避免使用假八层的叠层,而导致PCB成本增加的问题.mb5ednc 由于大家的回答很踊跃,看来这个问题还是比较典型的.在 ...

  4. 两层板(双面板)如何控制50欧特性阻抗

    我们都知道,在射频电路的设计过程中,走线保持50欧姆的特性阻抗是一件很重要的事情,尤其是在Wi-Fi产品的射频电路设计过程中,由于工作频率很高(2.4GHz或者5.8GHz),特性阻抗的控制就显得更加 ...

  5. 2层板天线50欧阻抗匹配

    2层板天线50欧阻抗匹配 画MC20模块底板,实测发现GPS功能不可用,无定位数据返回.使用馈线从模块天线引脚飞线到SMA端子处,功能恢复可用.基本确定是因为板子GPS天线部分未做50欧阻抗匹配,导致 ...

  6. 两层板PCB如何设计的? 三层板的PCB又是如何设计的?

    来自群友的疑难杂症(加杨老师V信:PCB206 可入群):杨老师,三层板如何设计?我想先学三层板,然后一直往后学,学到十层板? 杨老师(PCB206)经过一些简单分析后,先让他学习两层板,然后学习一个 ...

  7. HEGERLS供应防腐防静电仓储层板货架 多层多功能自由组合仓库货架

    重型仓储层板式货架,主要是由立柱.横梁.层板(托盘)组成,其立柱表面采用独特的菱形孔设计,同时安装时不用螺丝和焊接,均采用插接式组合,直接将横梁上的挂件往菱形孔内下压即可. 重型仓储层板式货架,还有多 ...

  8. 如何用powerPCB设定4层板的层?-道合顺大数据Infinigo

    可以将层定义设为 1:no plane+ component(top route) 2:cam plane或split/mixed (GND) 3:cam plane或split/mixed (pow ...

  9. 技术分享!如何用powerPCB设定4层板的层?-道合顺大数据Infinigo

    可以将层定义设为 1:no plane+ component(top route) 2:cam plane或split/mixed (GND) 3:cam plane或split/mixed (pow ...

  10. 4层板PCB设计(基于AD)

    (2012-08-23 10:46:09) 标签: 杂谈 分类: 技术_硬件 在系统提供的众多工作层中,有两层电性图层,即信号层与内电层,这两种图层有着完全不同的性质和使用方法. 信号层被称为正片层, ...

最新文章

  1. hadoop mac和linux,How to Install Hadoop? (On Mac OS,Linux or Cygwin on Windows)
  2. 【学习笔记】20、日期和时间模快
  3. LeetCode 13 罗马数字转整数
  4. All Things OpenTSDB
  5. 洛谷 2585 [ZJOI2006]三色二叉树——树形dp
  6. 使用Jquery中ajax实现上传文件
  7. OpenCV编程简介
  8. 第三章第二十一题(科学:某天是星期几)(Science: day of the week)
  9. 12306脱库疑云:410万用户数据仅售20美元!
  10. 有一个已经排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中
  11. Linux-引导过程与服务控制
  12. 微信公众号如何添加文档附件【教程】
  13. 使用ardunio制作神秘礼物(环境光传感器、舵机、LED、蜂鸣器)
  14. cv2.warpAffine 参数详解
  15. ShowWindow 函数
  16. 数字图像处理——信用卡数字识别
  17. linux vi 保存退出与不保存退出
  18. 新浪微博草根大号困局:新鲜感丧失 商业化过度
  19. 服务器蓝屏显示3b,win7蓝屏代码3b怎么回事_网站服务器运行维护
  20. php验证码zhuc_微信小程序实例:实现随机验证码(附代码)

热门文章

  1. 论文阅读 | Analysis and comparison of MIMO radar waveforms MIMO雷达波形总结 (TDMA, CDMA, DDMA, FDMA等)
  2. oracle+clod+和bolb,Azure存储Blob类型(CloudBlobContainer,CloudBlobClient等)和线程安全
  3. spring cloud搭建教程
  4. 周鸿祎:35告老的大富豪
  5. CSS backdrop-filter 滤镜 毛玻璃效果
  6. 大规模MIP的精确算法和实现
  7. ANE for Android Setp by Step
  8. 摩根大通的企业级区块链解决方案—Quorum
  9. 再见,百度网盘!新 60MB/s!
  10. 第二届全国中学生网络安全竞赛线上 writeup