分享一下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. Pycharm工具配置记录

    安装Pycharm工具后,常用配置方法记录: 1:开启“设置”快捷按钮 2:进入设置后,选择或添加python解释器 当然,python解释器需要提前安装好. 3:在设置里,配置默认模板 4 :自动更 ...

  2. 三、fs文件操作模块

    fs模块用于文件的读写等操作. 该模块有如下这些方法: 1.fs.stat() : 检测是文件还是目录 const fs = require('fs'); fs.stat('test.html',fu ...

  3. poj——3177Redundant Paths

    poj——3177Redundant Paths      洛谷—— P2860 [USACO06JAN]冗余路径Redundant Paths Time Limit: 1000MS   Memory ...

  4. 关于用String Calender类 计算闰年的Demo

    package cn.zmh.zuoye; import java.util.Calendar; public class StringRun { public static void main(St ...

  5. 解决idea中启动tomcat出现控制台乱码问题

    尝试了很多方法,最后终于解决了,现在提供给大家一个我认为最简单也最有效的方案. 1.修改配置文件 找到idea的安装目录,在bin文件夹下找到以下两个文件,用记事本或者其他软件打开: 然后两个文件中都 ...

  6. 异常处理(try catch throw)详解(C++)

    选择异常处理的编程方法的具体原因如下: 1.把错误处理和真正的工作分开来: 2.代码更易组织,更清晰,复杂的工作任务更容易实现: 3.毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了: 4 ...

  7. 一次使用NodeJS实现网页爬虫记

    前言 几个月之前,有同事找我要PHP CI框架写的OA系统.他跟我说,他需要学习PHP CI框架,我建议他学习大牛写的国产优秀框架QeePHP. 我上QeePHP官网,发现官方网站打不开了,GOOGL ...

  8. 一个重绘MFC的文件传输client

     一个重绘MFC的文件传输client,TCP/IP协议的文件传输client(支持上传.下载.续传.管理等功能,本处仅仅选择了上传功能).从用户视觉上看,肯定比原生MFC界面要有感觉,啥也不说了 ...

  9. libevent API 介绍

    基本应用场景也是使用 libevnet 的基本流程,下面来考虑一个最简单的场景,使用livevent 设置定时器,应用程序只需要执行下面几个简单的步骤即可. 1)首先初始化 libevent 库,并保 ...

  10. ZOJ 2706 Thermal Death of the Universe (线段树)

    题目链接:ZOJ 2706 Thermal Death of the Universe (线段树) 题意:n个数.m个操作. 每一个操作(a,b)表示(a,b)全部值更新为这个区间的平均数:1.当前的 ...