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

 一.PCB 合拼(全排序+旋转90度)的时间复杂度是多少?

二.合拼遍历(全排序+旋转90度)  基本遍历方法 

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;
}
}
 三. 上面代码,A,B,C三款板运行后效果

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度) 基本遍历方法的更多相关文章

  1. python-Day4-迭代器-yield异步处理--装饰器--斐波那契--递归--二分算法--二维数组旋转90度--正则表达式

    本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...

  2. LeetCode48, 如何让矩阵原地旋转90度

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode第29篇,我们来看一道简单的矩阵旋转问题. 题意 题目的要求很简单,给定一个二维方形矩阵,要求返回矩阵旋转90度之后的 ...

  3. 关于android中调用系统拍照,返回图片是旋转90度

    转载博客:http://blog.csdn.net/walker02/article/details/8211628 项目开发中遇到的一个问题,对于三星手机在做手机照片选择时出现图片显示不正常,研究后 ...

  4. 移动端上传照片 预览+Draw on Canvas's Demo(解决 iOS 等设备照片旋转 90 度的 bug)

    背景: 本人的一个移动端H5项目,需求如下: 需求一:手机相册选取或拍摄照片后在页面上预览 需求二:然后绘制在canvas画布上 这里,我们先看一个demo(http://jsfiddle.net/q ...

  5. 利用exif.js解决ios手机上传竖拍照片旋转90度问题

    html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非 ...

  6. 解决ios手机上传竖拍照片旋转90度问题

    html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非 ...

  7. PyOpenCV图像逆时针旋转90度

    warpAffine方法效果很搓,留下大片黑色区域. 使用flip和transpose可以实现逆时针旋转90度.先flip或先transpose均可. #coding:utf-8 import cv2 ...

  8. MTK 屏幕旋转90度

    http://blog.csdn.net/ouo555/article/details/44806837 1.屏幕显示顺时针旋转90度 lk 横屏logo,顺时针旋转90度显示修改bootable/b ...

  9. C++ 方阵原地旋转90度

    不额外申请内存(另外的一个二维数组空间),将一个方阵(二维数组)原地旋转90度,主要的思路是,由外向内,一圈圈的进行旋转(就是依次进行交换),如下图所示,当这些圈圈都交换完了之后,就完成了原地旋转了. ...

随机推荐

  1. Wannafly挑战赛2_D Delete(拓扑序+最短路+线段树)

    Wannafly挑战赛2_D Delete Problem : 给定一张n个点,m条边的带权有向无环图,同时给定起点S和终点T,一共有q个询问,每次询问删掉某个点和所有与它相连的边之后S到T的最短路, ...

  2. 从零开始写STL-string类型

    class string { public: typedef size_t size_type; typedef char* iterator; typedef char value_type; pr ...

  3. hdu4085(斯坦纳树)

    题意: 给你n,m,k ,分别表示有n个点,m条边,每条边有一个权值,表示修复这条边需要的代价,从前k个点中任取一个使其和后k个点中的某一个点,通过边连接,并且必须是一一对应,问最小的代价是多少. 分 ...

  4. Spring Boot+Profile实现不同环境读取不同配置

    文件结构如下: 但是官方推荐放在config文件夹下. 作用: 不同环境的配置设置一个配置文件,例如:dev环境下的配置配置在application-dev.properties中.prod环境下的配 ...

  5. [vxlan] 一 Why VXLAN

    想了解一个事物/概念,最好的办法是知道它是为什么出现的,为了解决那些问题而出现.这里,就用这种方式来学习一下VXLAN VXLAN (Virtual eXtensible Local Area Net ...

  6. leetCode 67.Add Binary (二进制加法) 解题思路和方法

    Given two binary strings, return their sum (also a binary string). For example, a = "11" b ...

  7. dva/dynamic

    1.安装: yarn add dva 2.引入: import dynamic from 'dva/dynamic'; * dva路由跳转 * dynamic(app, model, componen ...

  8. jni——如何转换有符号与无符号数

    java数据结构默认均为有符号数,而通过jni转换到c/c++层,却不一定是有符号数. 如若在java中存储的即为无符号数,则在jni中可将jbyte直接进行类型转换. 若进行操作,则可在计算时,先将 ...

  9. javaEE之------ApectJ的切面技术===标签

    如今比較流行了aop技术之中的一个========标签 实现步骤: 一,导入aop标签 方法,打开aop包.里面就有. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5 ...

  10. 配置pydot环境

    第一次配置pydot环境,过程还是比較曲折,看来对这样的模式还不是非常熟悉.断断续续弄了两天弄好了.都是些小要求,小细节问题. 安装的顺序也非常重要: 1.安装python-2.7.8.amd64.m ...