PCB 合拼遍历(全排序+旋转90度) 基本遍历方法
分享一下PCB合拼的组合的遍历方法,在分享之前先纠正一下 PCB拼板之多款矩形排样算法实现--学习 时间复杂度计算错误

1.调用方法
//准备数据
List<RectSizeDemo> RectSizeList = new List<RectSizeDemo>();
RectSizeList.Add(new RectSizeDemo() { Name = "A板" });
RectSizeList.Add(new RectSizeDemo() { Name = "B板" });
RectSizeList.Add(new RectSizeDemo() { Name = "C板" });
//3款板 全排序组合总类 1*2*3=6
//3款板 旋转90度组合总类 2*2*2=8
//3款板 总排样组合 6*8=48种组合
//计算 PCB旋转90度组合总类
int PowCount = (int)Math.Pow(, RectSizeList.Count()) - ;
//执行PCB 合拼遍历(全排序+旋转90度)
RectSizeDemo.Loop(RectSizeList, PowCount, , RectSizeList.Count - );
2.合拼遍历方法类(全排序+旋转90度)
/// <summary>
/// 全排序+旋转90 示例
/// </summary>
public class RectSizeDemo
{
/// <summary>
/// PCB板名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 成品尺寸
/// </summary>
public Size Size { get; set; }
/// <summary>
/// 递规全排序+旋转
/// </summary>
/// <param name="RectSizeList"></param>
/// <param name="PowCount"></param>
/// <param name="k"></param>
/// <param name="m"></param>
public static void Loop(List<RectSizeDemo> RectSizeList, int PowCount, int k, int m)
{
if (k == m)
{
for (int i = ; i <= PowCount; i++)
{
for (int j = ; j <= m; j++)
{
string pnString = (((i >> j) & ) == ) ? "旋转0 " : "旋转90";
Console.Write($"【{RectSizeList[j].Name} {pnString}】");
}
Console.WriteLine("");
}
Console.WriteLine("===============================");
}
else
{
for (int i = k; i <= m; i++)
{
Swap(RectSizeList, k, i);
Loop(RectSizeList, PowCount, k + , m);
Swap(RectSizeList, k, i);
}
}
}
/// <summary>
/// 交换数据
/// </summary>
/// <param name="RectSizeList"></param>
/// <param name="i"></param>
/// <param name="j"></param>
public static void Swap(List<RectSizeDemo> RectSizeList, int i, int j)
{
RectSizeDemo t = RectSizeList[i];
RectSizeList[i] = RectSizeList[j];
RectSizeList[j] = t;
}
}
1.A,B,C三款PCB板合拼,全排序组全共1*2*3=6种排样方式
2.每一种全排序组合,对应每款板都可以旋转90度,那么旋转组合总数2*2*2=8种旋转方式
3.总排样组合:6*8=48种组合

当PCB板为10款板,排样组合总类数达到了惊人的37亿种组合,如此大计算量,普通计算机已消化不了这么大计算量了,那么我们可以想像一下,如果PCB合拼是20款板或30款板,再或者PCB合拼中嵌入了各种规则加入排样算法中,此时还想指望计算机能有限时间内计算全部排样方式来是不现实的。当我们遇到组合爆炸问题, 通常会在合拼算法上做一些技巧处理,虽然不能达到全局最优解,但在算法优化上以我们对PCB的合拼排样规则深入了解,可以近可能的的求出近似最优解的。
附上PCB合拼排样方案


PCB 合拼遍历(全排序+旋转90度) 基本遍历方法的更多相关文章
- python-Day4-迭代器-yield异步处理--装饰器--斐波那契--递归--二分算法--二维数组旋转90度--正则表达式
本节大纲 迭代器&生成器 装饰器 基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...
- LeetCode48, 如何让矩阵原地旋转90度
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode第29篇,我们来看一道简单的矩阵旋转问题. 题意 题目的要求很简单,给定一个二维方形矩阵,要求返回矩阵旋转90度之后的 ...
- 关于android中调用系统拍照,返回图片是旋转90度
转载博客:http://blog.csdn.net/walker02/article/details/8211628 项目开发中遇到的一个问题,对于三星手机在做手机照片选择时出现图片显示不正常,研究后 ...
- 移动端上传照片 预览+Draw on Canvas's Demo(解决 iOS 等设备照片旋转 90 度的 bug)
背景: 本人的一个移动端H5项目,需求如下: 需求一:手机相册选取或拍摄照片后在页面上预览 需求二:然后绘制在canvas画布上 这里,我们先看一个demo(http://jsfiddle.net/q ...
- 利用exif.js解决ios手机上传竖拍照片旋转90度问题
html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非 ...
- 解决ios手机上传竖拍照片旋转90度问题
html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非 ...
- PyOpenCV图像逆时针旋转90度
warpAffine方法效果很搓,留下大片黑色区域. 使用flip和transpose可以实现逆时针旋转90度.先flip或先transpose均可. #coding:utf-8 import cv2 ...
- MTK 屏幕旋转90度
http://blog.csdn.net/ouo555/article/details/44806837 1.屏幕显示顺时针旋转90度 lk 横屏logo,顺时针旋转90度显示修改bootable/b ...
- C++ 方阵原地旋转90度
不额外申请内存(另外的一个二维数组空间),将一个方阵(二维数组)原地旋转90度,主要的思路是,由外向内,一圈圈的进行旋转(就是依次进行交换),如下图所示,当这些圈圈都交换完了之后,就完成了原地旋转了. ...
随机推荐
- hdu5608:function
$n^2-3n+2=\sum_{d|i}f(i)$,问$f(i)$前$n$项和. 方法一:直接切入! $S(n)=\sum_{i=1}^{n}f(i)=\sum_{i=1}^{n}(i^2-3i+2- ...
- linux 安装问题make: 没有指明目标并且找不到makefile。 停止
错误发生的可能原因,忘记安装软件需要的依赖.
- UITextInputMode currentInputMode is deprecated. 警告的解决
如果你的工程最低支持版本为7.0 你会发现有警告 : 'currentInputMode' is deprecated: first deprecated in iOS 7.0 替换方案:UIText ...
- HDU 4786 Fibonacci Tree(生成树,YY乱搞)
http://acm.hdu.edu.cn/showproblem.php? pid=4786 Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others ...
- iOS macOS的后渗透利用工具:EggShell
EggShell是一款基于Python编写的iOS和macOS的后渗透利用工具.它有点类似于metasploit,我们可以用它来创建payload建立侦听.此外,在反弹回的session会话也为我们提 ...
- [Node.js] Write or Append to a File in Node.js with fs.writeFile and fs.writeFileSync
In node.js, you can require fs, and then call fs.writeFile with the filename, and data to write to t ...
- Office EXCEL 2010如何取消宏密码保护
打开宏编辑器之后,右击VBA项目,然后属性,保护中去掉密码即可
- 微信小程序实战之 goods(订餐页)
项目目录: 模拟数据: utils / data.js function getSData() { var data = [ { "name": "热销榜", ...
- cf246 ENew Reform (并查集找环)
Berland has n cities connected by m bidirectional roads. No road connects a city to itself, and each ...
- CentOS 使用httpd 配置局域网 yum源
1.上传centos iso而且挂载 mkdir /mnt/cdr/iso mount -o /xxx.iso /mnt/cdr 2.使用createrepo来创建repo文件 cd /mnt/cdr ...