层板等分衣柜(C++)
描述:
给定一个高度为 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++)相关推荐
- 可编程led灯带原理_88张图搞定层板灯带的设计、安装、收口及检修!
dop设计(ID:dopdesign)原创 作者丨泽顺 编辑丨那兰 "光之于空间,犹如空气之于生命" 光的存在赋予了空间生命和灵魂.无论是建筑空间还是室内装饰设计,光都是设计当中必 ...
- 4层板到12层板叠层经典设计方案
目录 1.4层板优选叠层方案 2.6层板优选叠层方案 3.8层板优选叠层方案 4.10层板优选叠层方案 5.12层板优选叠层方案 6.总结 电路板的叠层设计是对PCB的整个系统设计的基础,叠层设计若有 ...
- pcb 假八层_八层板的成本却只六层的性能,PCB设计遭遇假八层该怎么办?
在<PCB的筋骨皮>一文中,我们提出了当板厚在1.6mm及以上时,怎样避免使用假八层的叠层,而导致PCB成本增加的问题.mb5ednc 由于大家的回答很踊跃,看来这个问题还是比较典型的.在 ...
- 两层板(双面板)如何控制50欧特性阻抗
我们都知道,在射频电路的设计过程中,走线保持50欧姆的特性阻抗是一件很重要的事情,尤其是在Wi-Fi产品的射频电路设计过程中,由于工作频率很高(2.4GHz或者5.8GHz),特性阻抗的控制就显得更加 ...
- 2层板天线50欧阻抗匹配
2层板天线50欧阻抗匹配 画MC20模块底板,实测发现GPS功能不可用,无定位数据返回.使用馈线从模块天线引脚飞线到SMA端子处,功能恢复可用.基本确定是因为板子GPS天线部分未做50欧阻抗匹配,导致 ...
- 两层板PCB如何设计的? 三层板的PCB又是如何设计的?
来自群友的疑难杂症(加杨老师V信:PCB206 可入群):杨老师,三层板如何设计?我想先学三层板,然后一直往后学,学到十层板? 杨老师(PCB206)经过一些简单分析后,先让他学习两层板,然后学习一个 ...
- HEGERLS供应防腐防静电仓储层板货架 多层多功能自由组合仓库货架
重型仓储层板式货架,主要是由立柱.横梁.层板(托盘)组成,其立柱表面采用独特的菱形孔设计,同时安装时不用螺丝和焊接,均采用插接式组合,直接将横梁上的挂件往菱形孔内下压即可. 重型仓储层板式货架,还有多 ...
- 如何用powerPCB设定4层板的层?-道合顺大数据Infinigo
可以将层定义设为 1:no plane+ component(top route) 2:cam plane或split/mixed (GND) 3:cam plane或split/mixed (pow ...
- 技术分享!如何用powerPCB设定4层板的层?-道合顺大数据Infinigo
可以将层定义设为 1:no plane+ component(top route) 2:cam plane或split/mixed (GND) 3:cam plane或split/mixed (pow ...
- 4层板PCB设计(基于AD)
(2012-08-23 10:46:09) 标签: 杂谈 分类: 技术_硬件 在系统提供的众多工作层中,有两层电性图层,即信号层与内电层,这两种图层有着完全不同的性质和使用方法. 信号层被称为正片层, ...
最新文章
- hadoop mac和linux,How to Install Hadoop? (On Mac OS,Linux or Cygwin on Windows)
- 【学习笔记】20、日期和时间模快
- LeetCode 13 罗马数字转整数
- All Things OpenTSDB
- 洛谷 2585 [ZJOI2006]三色二叉树——树形dp
- 使用Jquery中ajax实现上传文件
- OpenCV编程简介
- 第三章第二十一题(科学:某天是星期几)(Science: day of the week)
- 12306脱库疑云:410万用户数据仅售20美元!
- 有一个已经排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中
- Linux-引导过程与服务控制
- 微信公众号如何添加文档附件【教程】
- 使用ardunio制作神秘礼物(环境光传感器、舵机、LED、蜂鸣器)
- cv2.warpAffine 参数详解
- ShowWindow 函数
- 数字图像处理——信用卡数字识别
- linux vi 保存退出与不保存退出
- 新浪微博草根大号困局:新鲜感丧失 商业化过度
- 服务器蓝屏显示3b,win7蓝屏代码3b怎么回事_网站服务器运行维护
- php验证码zhuc_微信小程序实例:实现随机验证码(附代码)
热门文章
- 论文阅读 | Analysis and comparison of MIMO radar waveforms MIMO雷达波形总结 (TDMA, CDMA, DDMA, FDMA等)
- oracle+clod+和bolb,Azure存储Blob类型(CloudBlobContainer,CloudBlobClient等)和线程安全
- spring cloud搭建教程
- 周鸿祎:35告老的大富豪
- CSS backdrop-filter 滤镜 毛玻璃效果
- 大规模MIP的精确算法和实现
- ANE for Android Setp by Step
- 摩根大通的企业级区块链解决方案—Quorum
- 再见,百度网盘!新 60MB/s!
- 第二届全国中学生网络安全竞赛线上 writeup