当前位置: 首页 > news >正文

6.1 宽度优先搜索算法(BFS)

        宽度优先搜索算法(BFS  Breadth first search) 又称广度优先搜索,这种搜索是逐层的,搜索完上层,才会搜索下一层,直到找到目标节点。
        
        搜索过程如图中箭头方向:
【例如】 八数码难题:利用空格的移动,使无规律的图案变成右侧有顺序的图案,下图所示:
思路如下:罗列所有可能情况;然后逐一检查是否是答案。
主要算法:
1. 查找左右移动后的图形:
 /// <summary>
        /// 空格向左移动,前提是空格不在最左一列
        /// </summary>
        /// <returns></returns>
        public ChessPos MoveLeft()
        {
            //若空格在最左边界上,无法左移
            if (ZeroColumn==0)
            {
                return null;
            }
            //先拷贝当前的,然后把空格左移动一位,交换下两个的数字
            ChessPos tmpPos = this.Clone() as ChessPos;                       
           
            tmpPos.father = this;
            tmpPos.position[ZeroRow, ZeroColumn] = position[ZeroRow, ZeroColumn - 1];
            tmpPos.position[ZeroRow, ZeroColumn - 1] = position[ZeroRow, ZeroColumn];
            return tmpPos;
        }
2.从Openlist中取节点、展开、然后添加到closedlist

 //当Open表中有内容,
            while (OpenList.Count > 0 && !bFindSolution)
            {
                //1.从Open表表头取一个对象,若该位置没有在closed表出现过,则放入到Close表。
                ChessPos tmp = OpenList[0];
                OpenList.RemoveAt(0);

                //判断该布局是否在close表中已经出现过
                bool bAlreadyExist = false;
                for (int i = 0; i <= CloseList.Count - 1; i++)
                {
                    if (CloseList[i].Equals(tmp))
                    {
                        bAlreadyExist = true;
                        break;
                    }
                }
                if (bAlreadyExist == false)
                {
                    CloseList.Add(tmp);
                }

                //2.获得新的4种空格的可能走法
                List<ChessPos> PossibleSteps = tmp.getNextPosition();
                foreach (ChessPos pos in PossibleSteps)
                {
                    //看是否已经达到最终位置
                    if (pos.IsSolution())
                    {
                        bFindSolution = true;
                        solution = pos;
                        break;
                    }
                    else if (CloseList == null || !CloseList.Contains(pos)    )
                    {
                        //若新的图案在open&close表中都没有出现过,则加入open表中
                        if(OpenList == null || !OpenList.Contains(pos) )
                        {
                            OpenList.Add(pos);
                        }
                    } 
                }
                OnProgressChanged(new ChessPosEventArg(OpenList.Count, CloseList.Count));
                //超过3万就不搜索了
                if (CloseList.Count > 30000)
                {
                    break;
                }
            }
 

代码在可以下载: https://download.csdn.net/download/qq_34047402/90563588
深度搜索、宽度搜索算法(以八数码、皇后、迷宫为例)资源-CSDN文库
https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.1d292c1bt6mw2Y&ft=t&id=905463299574

相关文章:

  • 1.Qt信号与槽
  • 如何删除Debian中的用户?删除Debian用户方法
  • 网络响应速度慢,应该用什么办法来定位问题?
  • WebUI问题总结
  • [dp4_路径问题] 下降路径最小和 | 最小路径和 | 地下城游戏
  • vscode报Module containing this breakpoint has not yet loaded
  • 【GPT入门】第33 课 一文吃透 LangChain:chain 结合 with_fallbacks ([]) 的实战指南
  • Oracle数据库数据编程SQL<6.1 数据字典表查询大全>
  • Java 大视界 -- 基于 Java 的大数据分布式存储在视频监控数据管理中的应用优化(170)
  • 论文笔记(七十四)Dense Policy: Bidirectional Autoregressive Learning of Actions
  • C++中顺序容器vector、list和deque的使用方法
  • 【QT】Qt5 QtWebEngine使用教程
  • 非阻塞IO,fcntl,多路转接,select,poll,epoll,reactor
  • 十五、Redis发布订阅模型
  • Ubuntu 20.04 出现问号图标且无法联网 修复
  • OpenCV图像输入输出模块imgcodecs(imwrite函数的用法)
  • C#里第一个WPF程序
  • 192.168.145.129
  • 42、填写表单后跳转至其他页面,返回时需保留已填数据
  • Axure项目实战:智慧运输平台后台管理端-司机管理(中继器)
  • 校园网站建设的感受论文/百度网盘官网登陆入口
  • 网站如何看是哪家公司做的/app推广一手单
  • 钢笔工具网站/网站优化排名的方法
  • 大良营销网站建设精英/seo培训班 有用吗
  • wordpress自助建站系统/发布信息的免费平台有哪些
  • seo网站建设方案/天津优化公司