华容道问题求解_详细设计(四)之查找算法2_BFS

(续上篇)
利用BFS查找,会找到最短路径(没有权重的图),这个道理比较简单,这是由于寻找路径的方法都是从起点或者接近起点的位置开始的。查找过程如果画出图来,类似于一圈圈的放大,你可以想想是一个类似圆的渐开线的扫描过程。
前文已经谈到,这个BFS和DFS的主要不同就是对当前参数的保存方法不同,即BFS采用队列保存,DFS采用堆栈保存。因此,将DFS的保存当前参数的方法改成队列就可以实现BFS了。

BFS 核心代码

       internal bool SearchPathBFS(int endHashCode)
       {
           
           if (statesObjQueue.Count == 0) return false;
           //##############################################################
           //## BFS 代码的改变如下                                        ##
           //##############################################################
           var lastState = DequeueState(); 
           //var lastHashCode=   layoutHashCodeStk.Pop();

           // map it to the current  state 
           MapToCurState(lastState);
           var curBestSteps = lastState.bestSteps+1;
           while (gameState.openPieces.Count > 0 && gameState.curOpenIdx < gameState.openPieces.Count)// There are open pieces not moved , move them one by one.
           {
               var selOpenPcs = gameState.openPieces[gameState.curOpenIdx];
               var selPcs = selOpenPcs.piece;
               var toPcs = selOpenPcs.MoveToPcs;
              var dirFrom = MoveToPcs(selPcs, toPcs);
               gameState.selPcs = selPcs;
               var redundant = RedundantState(gameState);
               StateShot stateShot = new StateShot(gameState, 0);
               // record the current best steps 
               stateShot.bestSteps = curBestSteps;
               //Create the graph data structure 
               AddEdgeToGraph(lastState, stateShot);
          if (gameState.curOpenIdx < lastState.openPcsArr.Length)
               {
                  gameState.curOpenIdx++;
                   lastState.lastOpenIdx = gameState.curOpenIdx;
                }
               if (!redundant.Item1)
               {
                   SearchOpenPieces();
                   stateShot = new StateShot(gameState, 0);
                   stateShot.bestSteps = curBestSteps;
           //##############################################################
           //## BFS 代码的改变如下                                       ##
           //##############################################################         
                   EnqueueState(lastState, stateShot, selPcs, toPcs);//add edge to the grapph and enqueue the current state
               }
               // 2024-01-30 Found the least steps with BFS and it runs very fast.
               // Judge if it succeeds that caocao is at the exit of the board.
               if (endHashCode==0 && selPcs.type == 4)
               {
                   if (selPcs.hrdPos.X == 2 && selPcs.hrdPos.Y == 4)
                   {
                       RefreshLayout();
                       Application.DoEvents();
                       var verTex = GetMyHashCodeV1(gameState);
                       // the layout might not the same that needs to record all of them 
                       if (!endVtxLst.Contains(verTex)) endVtxLst.Add(verTex);
                       //MessageBox.Show(string.Format("Success! The best steps is {0},the hash code is {1}", hCodeAndShotShortPathDict[verTex].Item2, verTex));
                       //return false;//debug
                  }
               }else if (redundant.Item2 == endHashCode)
               {
                   RefreshLayout();
                   Application.DoEvents();
                   var verTex = GetMyHashCodeV1(gameState);
                   // the layout might not the same that needs to record all of them 
                   if (!endVtxLst.Contains(verTex)) endVtxLst.Add(verTex);
                   }
               MapToCurState(lastState); // back the last state and try to moev next open pieces
            
           }
          return true;
       }

和DFS的代码对比一下就会发现,除了堆栈改成队列之外,代码几乎没有做什么改变。

下面给出 两个主要变化的函数代码
入队代码:

       private void EnqueueState(StateShot source, StateShot dest, Piece selPcs, Piece dstPcs)
       {
           statesObjQueue.Enqueue(dest);
           var toHashCode = GetMyHashCode(dest);

           stateHashCodeLst.Add(toHashCode);

           int[,] layoutArr = new int[6, 7];

           Array.Copy(dest.layoutOfIdx, layoutArr, layoutArr.Length);
           hCodeAndShotDict.Add(toHashCode, (dest.basePcs, selPcs.idx, dstPcs.idx));
           var frmHashCode = GetMyHashCode(source);
           AddEdge(frmHashCode, toHashCode, 1);
       }

出队代码

       private StateShot DequeueState()
       {
           var stshot = statesObjQueue.Dequeue();
          
           //stateHashCodeStack.Pop();
           return stshot;
       }

其中 statesObjQueue 的定义为;

//used to store the game state and the shortest path from last state For BFS search 
       private Queue<StateShot> statesObjQueue= new Queue<StateShot>();

运行之后,就很快找到了最少步数,虽然在过程当中也构建了一个图,但是并没有使用这个图。

结果也比较理想,是一个对称的结果,符合预期。这个原因,我想是因为在BFS 的求解过程当中的每一次探索的步数的基数都是一样的,而路径是不同的,因此也就必然会出现这么一种结果。
运行结果获得30种符合要求的布局,根据对称性,应该是15 中不同的解法。
截图如下:
说明:左面列表数值是该布局对应的Hash值
在这里插入图片描述
在这里插入图片描述
对比上面的布局,发现这是个对称的布局。这些解法中,最少的是81步,最多的是 115步。
其余结果请参考下列视频。另外 “不同解法 ”的含义就是最终的布局不同。

横刀立马最佳结果集


基本功能的探索到此告一段落,后面将对显示和布局设计进行一些尝试。

marasun BJFWDQ
204-03-09

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/443404.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据分析-Pandas最简单的方法画矩阵散点图

数据分析-Pandas直接画矩阵散点图 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&…

数学建模理论与实践国防科大版

目录 1.数学建模概论 2.生活中的数学建模 2.1.行走步长问题 2.2.雨中行走问题 2.3.抽奖策略 2.4.《非诚勿扰》女生的“最优选择” 3.集体决策模型 3.1.简单多数规则 3.2.Borda数规则 3.3.群体决策模型公理和阿罗定理 1.数学建模概论 1.数学模型的概念 2.数学建模的概…

【理解指针(1)】

理解指针&#xff08;1&#xff09; 1什么是内存2指针变量和地址21 取地址操作符&#xff08;&&#xff09;22 指针变量23 解引用操作符&#xff08;*&#xff09;24 指针变量的大小 3指针变量的意义31指针的解引用32 指针加减整数33 void* 指针 4. const 修饰指针41 const…

和数软件:区块链技术的爆发与冲击

什么是区块链&#xff1f;它是如何发展而来的&#xff1f;应用在哪些领域&#xff1f;将会对我国的社会经济产生哪些重大影响&#xff1f; 什么是区块链 区块链作为一种底层技术&#xff0c;最早的实践是数字货币。根据最早的中本聪定义&#xff0c;区块链实质上是一种基于网…

202109 CSP认证 | 脉冲神经网络

3. 脉冲神经网络 好久之前第一次写的时候完全对第三题没感觉&#xff0c;提交上去得了个0 分… 这次自己再写了一遍&#xff0c;花的时间不多&#xff0c;写的时候感觉逻辑也不是特别难。最后是超时了&#xff0c;感觉第三题开始涉及到优化了&#xff0c;不仅仅是暴力模拟就可以…

纪年哥的文物挽救木牌

左&#xff08;江南制造局&#xff0c;曾国藩书天道酬勤&#xff0c;李鸿章少荃印&#xff0c;光绪三十四年制造&#xff09; 中&#xff08;汉阳兵工厂&#xff0c;民国二十六年制造&#xff0c;公元1937年七月七日&#xff0c;抗日战争全面爆发&#xff09; 右&#xff08;…

二 centos 7.9 磁盘挂载

上一步 一 windso10 笔记本刷linux cent os7.9系统-CSDN博客 笔记本有两个盘,系统装在128G的系统盘上,现在把另外一个盘挂载出来使用 lsblk 发现磁盘已经分好了,直接挂载就好了,参考文章:Centos7.9 挂载硬盘_centos7.9挂载硬盘-CSDN博客 永久挂载 lsblk -f分区格式化 mkfs…

upload-labs通关记录

文章目录 前言 1.pass-012.pass-023.pass-034.pass-045.pass-056.pass-067.pass-078.pass-089.pass-0910.pass-1011.pass-1112.pass-1213.pass-1314.pass-1415.pass-1516.pass-1617.pass-1718.pass-1819.pass-19 前言 本篇文章记录upload-labs中&#xff0c;所有的通过技巧和各…

首席翻译张璐老师,今年见不到了

她是我的偶像&#xff0c;张璐&#xff0c;连续多年在重量级会议上担任翻译。 2010年&#xff0c;张璐作为翻译出现&#xff0c;是五年来国家级媒体发布会首次起用女翻译。 2011年3月14日的媒体发布会。张璐再任会议翻译。 2012年的媒体发布会&#xff0c;张璐任翻译。 2013年&…

制定一份完美的测试计划,让您的产品质量更上一层楼!

大家好&#xff0c;我是彭于晏。今天学习测试计划如何书写。 虽然很多人日常工作中都知道测试计划是什么&#xff0c;但是写好测试计划&#xff0c;其实并不容易。今天就来一起学习下测试计划如何书写。 什么是测试计划&#xff1f; 测试计划是一份为软件产品所准备的详细文档…

帮管客CRM jiliyu接口存在SQL漏洞 附POC软件

免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. 帮管客CRM简介 微信公众号搜索:南风漏洞复现文库…

yolo模型中神经节点Mul与Sigmoid 和 Conv、Concat、Add、Resize、Reshape、Transpose、Split

yolo模型中神经节点Mul与Sigmoid 和 Conv、Concat、Add、Resize、Reshape、Transpose、Split 在YOLO&#xff08;You Only Look Once&#xff09;模型中&#xff0c;具体作用和用途的解释&#xff1a;

接口自动化测试从入门到高级实战!

接口测试背景和必要性 接口测试是测试系统组件间接口&#xff08;API&#xff09;的一种测试&#xff0c;主要用于检测内部与外部系统、内部子系统之间的交互质量&#xff0c;其测试重点是检查数据交换、传递的准确性&#xff0c;控制和交互管理过程&#xff0c;以及系统间相互…

深入浅出计算机网络 day.1 概论③ 电路交换、分组交换和报文交换

人无法同时拥有青春和对青春的感受 —— 04.3.9 内容概述 01.电路交换、分组交换和报文交换 02.三种交换方式的对比 一、电路交换、分组交换和报文交换 1.电路交换 计算机之间的数据传送是突发式的&#xff0c;当使用电路交换来传送计算机数据时&#xff0c;其线路的传输效率一…

Rust教程:How to Rust-从开始之前到Hello World

本文为第0篇 专栏简介 本专栏是优质Rust技术专栏&#xff0c;推荐精通一门技术栈的蟹友&#xff0c;不建议基础的同学&#xff08;无基础学Rust也是牛人[手动捂脸]&#xff09; 感谢Rust圣经开源社区的同学&#xff0c;为后来者提供了非常优秀的Rust学习资源 本文使用&…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Image)

Image为图片组件&#xff0c;常用于在应用中显示图片。Image支持加载PixelMap、ResourceStr和DrawableDescriptor类型的数据源&#xff0c;支持png、jpg、jpeg、bmp、svg、webp和gif类型的图片格式。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&am…

【C/C++】常量指针与指针常量的深入解析与区分(什么是const int * 与 int * const ?)

目录 一、前言 二、const 的简单介绍 三、常量指针 &#x1f50d;介绍与分析 &#x1f4f0;小结与记忆口诀 四、指针常量 &#x1f50d;介绍与分析 &#x1f4f0;小结与记忆口诀 五、总结与提炼 六、共勉 一、前言 在【C/C】的编程中&#xff0c;指针与const关键字的组合…

大模型笔记:幻觉 hallucination

1 介绍 “幻觉” (Hallucination)&#xff0c;指模型生成自然流畅&#xff0c;语法正确但实际上毫无意义且包含虚假信息即事实错误的文本&#xff0c;以假乱真&#xff0c;就像人产生的幻觉一样。 举个例子就是&#xff0c;即使现在的chatgpt-4&#xff0c;你问他一些有确切…

面向切面编程(AOP)介绍(横切关注点、通知(增强)、连接切入点、切面)

1. 面向切面编程思想AOP AOP&#xff1a;Aspect Oriented Programming面向切面编程 AOP可以说是OOP&#xff08;Object Oriented Programming&#xff0c;面向对象编程&#xff09;的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构&#xff0c;用于模拟公…

Qt 实现诈金花的牌面值分析工具

诈金花是很多男人最爱的卡牌游戏 , 每当你拿到三张牌的时候, 生活重新充满了期待和鸟语花香. 那么我们如果判断手中的牌在所有可能出现的牌中占据的百分比位置呢. 这是最终效果: 这是更多的结果: 在此做些简单的说明: 炸弹(有些地方叫豹子) > 同花顺 > 同花 > 顺…