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度,主要的思路是,由外向内,一圈圈的进行旋转(就是依次进行交换),如下图所示,当这些圈圈都交换完了之后,就完成了原地旋转了. ...
随机推荐
- 用 Gearman 分发 PHP 应用程序的工作负载【转载】
通过本文,了解工作分发系统 Gearman 并分发用 PHP.C.Ruby 及其他受支持语言编写的应用程序的工作负载. 尽管一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体 ...
- python学习之-- RabbitMQ 消息队列
记录:异步网络框架:twisted学习参考:www.cnblogs.com/alex3714/articles/5248247.html RabbitMQ 模块 <消息队列> 先说明:py ...
- Pick-up sticks--poj2653(判断两线段是否相交)
http://poj.org/problem?id=2653 题目大意:有n根各种长度的棍 一同洒在地上 求在最上面的棍子有那几个 分析: 我刚开始想倒着遍历 因为n是100000 想着会 ...
- 动态规划:HDU 1114 Piggy-Bank
Problem Description Before ACM can do anything, a budget must be prepared and the necessary financia ...
- strcpy c标准库函数
C语言标准库函数strcpy,把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间. 已知strcpy函数的原型是: char *strcpy(char *dst, const ...
- JAVA_构造方法
构造方法: 作用:是给对象的数据进行初始化用的. 特点:1 必须和类的名字一样. 2 和真正的方法是有所不同的,构造方法是没有返回值的类型的 eg: 方法:public void User ( ...
- Hive安装中遇到过的坑
实现说明每一个用户的环境都有细微的不一致,所以这里只是个人经过这些坑的处理,但是不意味着所有处理都是这样的操作,仅作为参考. 第一个坑 数据库安装,数据库最好装在Linux上,一直出了很多错,这里有一 ...
- StringUtil内部方法差异
StringUtil 的 isBlank.isEmply.isNotEmpty.isNotBlank 区别 String.trim()方法: trim()是去掉首尾空格 append(Stri ...
- UVALive3211- Now or later(二分+2-SAT)
题目链接 题意:有n架飞机.每架飞机都能够选择早着陆和晚着陆两种方式之中的一个,且必须选择一种. 任务就是安排全部飞机着陆时.相邻两个着陆时间间隔的最小值尽量大. 思路:用二分处理最小值尽量大.该题目 ...
- 分享一个纯css制作的动画化,在网页(手机)载入等的时候能够引用!
CSS代码例如以下: /* Custom Stylesheet */ body, html { margin: 0; -webkit-font-smoothing: antialiased; back ...