按:之所以用小结局而非大结局,因为笔者的解法并没有给出理论上的全部解,只是给出了大部分解法。

算法描述如下

#1 初始化
#完成七巧板组件的初始化以及盛放七巧板的容器的初始化;
#2 采用DFS 方法获得解集合并记录
#3 以图片方式输出结果

采用堆栈实现的复原核心伪代码如下:

       private void PutTPartInBox(TangramPartSet tgPartSet){//1# prepare the components of the tangram .....// DFS to find a solution while (!m_Stop){///###################################################################################region 1 Take  a part from the lib , TAKE A NEW ONE FROM THE LIB ///##################################################################################if (bTakeFromLib){curPart = tgPartSet.GetOtherPartFromLib(curFailedParts);if (curPart != null)// if the lib is not empty{InitialilizeTheComponents(); bTakeFromBox = false;// not take from the box bToNextBoxIdx = false;else // there is no required component in the lib{bTakeFromBox = true;// should take the components from the box(stack)}}///###################################################################################endregion 1 Take one part from the LIB ///##################################################################################//###################################################################################region 2 Take one part from the box(pop up) and addjust its position in the box.//##################################################################################if (bTakeFromBox){if (tgPartSet.CountInBox() > 0){curPart = tgPartSet.TakeLastPartFromBox();}else{//MessageBox.Show("All of the scenarios have been tried, commission complete.");break;}}//###################################################################################endregion 2 Take one part from the box //###################################################################################region //################# state check          ##########################curBoxPlg = curPart.m_Plg.usingBoxPlg;curPartPlg = curPart.m_Plg;var statePlgCnt = curPartPlg.SatePlgCount;var boxVtxCnt = curPartPlg.usingBoxPlg.Count();bool bPartIdxEnd = curPartPlg.StatePlgIndex >= statePlgCnt - 1;bool bBoxIdxEnd = curBoxPlg.usingIdx > boxVtxCnt - 1;if (!bPartIdxEnd)// Try next state part polygon , inner loop,  {curPartPlg.StatePlgIndex++;}else{if (!bBoxIdxEnd)//outer loop{curBoxPlg.usingIdx++;curPartPlg.StatePlgIndex = 0;}else// all of the loop ended, put it to the lib and get another one {AddFailedPartForStep(curPart, FailedPartsForStep, tgPartSet.GetCurStep());curFailedParts = _GetFailedPartForCurStep();bTakeFromLib = true;bTakeFromBox = false;tgPartSet.ReturnPartToLib(curPart);exePath += "3 ->Take another one  " + string.Format("_{0} [{1}]_", curPart.m_No, _InBoxType());continue;}}#endregion //####################  state check    ##############################   ///###################################################################################region 3 Begin to adjust(Match) the part in the box (addjust its positon)///##################################################################################bMounted = CMyPolygonTool.MatchPolygon(curPartPlg, tgPartSet.m_MainBoxPlg, out outPart, pbxTestingBox);// check if the component can be put in the box
///###################################################################################endregion 3 Begin to adjust the part in the box (addjust its positon)///##################################################################################///###################################################################################region 4 The part can not be set in the box (not matched)///##################################################################################if (!bMounted)// Not matched , continue to take out component from the box( stack pop){tgPartSet.PutPartInBox(curPart);//  Put it in the box,, just to make for a loop, notice the stattus has been changedbTakeFromLib = false;bTakeFromBox = true;continue;}///###################################################################################endregion 4 The part can not be set in the box (not match)///##################################################################################///###################################################################################region 5 The part CAN be set in the box (Matched)///##################################################################################if (bMounted)// this one can be put in the box , calcula the remainning area and take another part from lib{tgPartSet.PutPartInBox(curPart);//  Put it in the box , and go on to take next part ( any type)bTakeFromLib = true;// initilize the failed part for this new level if (FailedPartsForStep.TryGetValue(tgPartSet.GetCurStep(), out _)){FailedPartsForStep.Remove(tgPartSet.GetCurStep());}curFailedParts = "";//######################################################//######!!!!   Find One !!!!!!!!!!!     ################//######################################################if (tgPartSet.CountInBox() == tgPartSet.GetTotalParts()){RecordInReusltList();bTakeFromLib = false;bTakeFromBox = true;continue;// succeed ,continue try to find another solution}//calculating the left area and get a new part to process //2.3#bTakeFromBox = false;curBoxPlg = newPlyLst[0];bTakeFromLib = true;continue;// mounted in the box, to get a new part}
///###################################################################################endregion 5 The part CAN be set in the box (Matched)///##################################################################################}}

说明:上述算法中有两个核心容器:Lib 用于存放七巧板组件,Box(Stack)用于摆放七巧板,如果Lib容器为空,则说明完成了一个摆放, 将结果记录下来;否则回退,尝试下一个摆放;摆放中用到了前文提到的各种判断以及剩余区域的计算。摆放时对七巧板进行了旋转和反转操作,力图模仿七巧板的真实摆放情况,摆放时的具体算法采用左下优先贴合的方法,实际上这样摆放之后会漏掉右上摆放的部分解。如图示:



这两种方法对应的结果是不一样的,这也是本解法不完备的地方。
笔者思考了解决办法,终极解法就是在剩余空腔的集合中再分别使用本方法进行DFS。这样程序结构稍微复杂一点,实际代码并没有实现。

部分界面参考

1、七巧板设计界面


笔者尝试解决的实际七巧板的组件如下:

解法探索探索界面

一共找到216 中解法(应该是不重复的), 部分解法截图如下

代码还有待完善,但是…再议吧、

MaraSun 与 BJFWDQ

抗疫人在继续,人生何其苦长。
人啊,何必跟人较劲呢?

七巧板复原算法之小结局——给出一个最大结果集相关推荐

  1. 七巧板复原算法之四——边沿贴合和空腔查找

    越想越复杂啊,一个一个的来吧.根据上文的讨论,把新的七巧板部件进行拼接时,可能会围成新的空腔,也可能是多个空腔,如图示: 空腔查找 G3-G5 都是摆放部件后形成的新的空腔,要把这些多边形找出来,并放 ...

  2. 七巧板复原算法探讨之二——七巧板的表示

    通常意义的七巧板就是个多边形,凸的或者凹的,因此只要确定了顶点,这个七巧板就确定了.简单查了一下多边形的表示方法,我决定采用顶点表示法,再加上考虑后面的计算需要,初步采用下面的链表结构,C# 表示法. ...

  3. 七巧板复原算法之三——摆放算法

    假设我们已经进行了一定的步骤,此时七巧板的摆放情况如下图示: 红色部分已经完成摆放的区域,蓝色部分是空的区域,分别用G1和G2表示.根据我们的人工摆放方法,可以得到摆放方法如下: 1)定位初始顶点和初 ...

  4. 七巧板复原算法——多边形的表示

    按:笔者此时已经完成了一个不完美的版本,已经把笔者的真实的七巧板解法算到了216 个,应该是不重复的.至于是不是还有更多的解法,目前不知道.因为我的算法的某些情况没有处理,因此不是一个完美的做法.本着 ...

  5. 七巧板复原算法——摆放和贴合算法的改进

    写了一点基础代码了,例如点在线段上的判断,线段相交的判断等等.(当然还是上网查了一下,没有自己推导,发现的确有更好的数学方法,谢谢各味图形学达人) 前文说到了摆放和贴合等等,用的基准图是下图中的 G1 ...

  6. 七巧板复原算法——计算机图形学基本算法之一, 点在多边形内部的判断

    注:此时我已经完成了一个演示版本,但是为了文章的渐进性,我将把开发过程一步步的写出来,用来记录. 本实验代码用到的图形学关系和算法列举如下: 基本计算机图形学关系和算法 1.点在多边形内部的 点在多边 ...

  7. 七巧板复原算法——计算机图形学基本算法之二,线段相交判断

    判断线段相交,朴素的方法(初中直线方程的判断方法),就是先计算两条直线的交点,然后再判断交点是否在其中一条的线段上.这也是笔者能唯一想到的方法,后来抱着试试看有没有更好方法的想法,搜了一下网络.哦, ...

  8. 碎纸片的拼接复原算法及MATLAB实现

    碎纸片的拼接复原算法及MATLAB实现 摘要:对于只有纵切的情形,文章通过比较当前待拼碎片与剩余碎片的信噪比psnr[1,3,4]的值来确定两碎片是否为邻接碎片:拼接算法首先连续调用右拼函数直到拼接到 ...

  9. 数组分成两组差值最小 python_数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小,数组中的数的取值范围是0x100,元素个数也是大于0, 小于100 。...

    比如a[]={2,4,5,6,7},得出的两组数{2,4,6}和{5,7},abs(sum(a1)-sum(a2))=0: 比如{2,5,6,10},abs(sum(2,10)-sum(5,6))=1 ...

最新文章

  1. 学Python很久只学了皮毛?
  2. 帮我看看这个是什么意思 c++代码
  3. vs2005打开vs2008
  4. 【吐血整理】面试官问的那些Java原理你都懂吗
  5. 人才短缺、成本高昂,制造企业智能化转型路径如何破局?
  6. python中grid函数_python tkinter中的grid布局是什么?
  7. D5SJ醴陵 2013最新版
  8. 【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点
  9. mysql show tables_MySQL防误删插件Recycle-Bin简介
  10. python如何调用文件进行换位加密_文件加密---使用换位加密和解密方法加密文件...
  11. linux git 搭建 debian,基于Debian Linux搭建Git服务器
  12. FireEye:K3chang行动***欧洲外交部门
  13. Linux 常用命令十四 killall和pkill
  14. 极智AI | 量化实现分享一:详解 min-max 对称量化算法实现
  15. Microsoft Visio 2010密钥
  16. Matlab鲁棒控制工具箱(Robust Control Toolbox)
  17. 可以弹奏的钢琴页面(HTML实现)
  18. Druid加载(load data)HDFS文件数据
  19. 浩瀚科技PDA移动开单|盘点机 数据采集器 条码扫描开单微POS软件 现场打印开单...
  20. C++高阶 常对象和常函数

热门文章

  1. Yolo-v4的CSPNet(Cross Stage Partial Network)
  2. 百度EasyDate线上协同数据标注平台使用
  3. mysql 关联删除_mysql 关联删除
  4. [Bash]LeetCode195. 第十行 | Tenth Line
  5. time of our lives---从世界杯主题曲看厚脸皮的德国人:)
  6. Dialog 对话框
  7. Kubernetes高可用性监控:Thanos的部署
  8. 轻松学,Java 中的代理模式及动态代理
  9. 冯登国院士团队重磅论文!《具体高效的安全多方计算协议综述》解读
  10. 锁定Mac电脑的8种方法