BFS求解迷宫最短路径

本文使用BFS广度优先搜索算法实现求解迷宫的最短路径(C++),使用到了队列先进先出的性质,依次搜索路径直到找到目标出口(如果迷宫能走通)求解到的路径即为该迷宫的最短路径,找到返回true,找不到返回false,本文使用vexmap一个map容器记录队列的搜索路径(记录队列路径的实现有点草率,可以再优化)。</p><p> </p><pre class="cpp" name="code">#include<iostream>
#include<queue>
using namespace std;
typedef unsigned long long iUINT64;
map<iUINT64,int> vexmap;
const int g_errNUM = 88888;
offsets myMove4[4] = {//各个方向的偏移表
 {-1,0,"N"},
 {0,1,"E"},
 {1,0,"S"},
 {0,-1,"W"},

};
class  Itmes
{
public:
 iUINT64 x,y;//偏移量x,y和试探方向
 Itmes():x(g_errNUM),y(g_errNUM)
 {
 }
};

bool BFS(Itmes star,Itmes end,int& cntNum)
{
 cntNum = 0;
 iUINT64 curx,cury,searchx,searchy;
 queue<Itmes> ItemQ;
 ItemQ.push(star);
 iUINT64 Star = star.x << 32 | star.y;
 vexMap[Star] = g_errNUM;
 mark[star.x][star.y] = 1;
 while (!ItemQ.empty())
 {
  Itmes tmp = ItemQ.front();
  curx = tmp.x; cury = tmp.y;
  ItemQ.pop();
  for (int i = 0; i < 4; i++)
  {
   searchx = curx + myMove4[i].a;
   searchy = cury + myMove4[i].b;
   if (Maze[searchx][searchy] == 0 && mark[searchx][searchy] == 0)
   {
    mark[searchx][searchy] = 1;
    Itmes tmp2;
    tmp2.x = searchx;
    tmp2.y = searchy;
    iUINT64 NodeCur = curx << 32 | cury;
    iUINT64 NodeSearch = searchx << 32 | searchy;
    vexMap[NodeSearch] = NodeCur;
    ItemQ.push(tmp2);
    //出口条件
    if (searchx == end.x && searchy == end.y)
    {
     iUINT64 Index = searchx << 32 | searchy;
     while (vexMap[Index] != g_errNUM)
     {
      Index = vexMap[Index];
      cntNum++;
      if (cntNum > 1000000)//防护防止出现死循环,可优化
      {
       return false;
      }
     }
     return true;
    }
   }
  }
 }
 return false;
}

时间: 2024-08-26 15:29:44

BFS求解迷宫最短路径的相关文章

BFS求解迷宫的最短路径问题

题目:给定一个大小为N*M的迷宫,迷宫由通道('.')和墙壁('#')组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置.试求出起点到终点的最小步数.(本题假定迷宫是有解的)(N,M<=100) 输入: 10 10#S######.#......#..#.#.##.##.#.#........##.##.####....#....#.#######.#....#......####.###.....#...G# 输出: 22 本题目与解题思路均来源于挑战程序设计

Sicily Maze(BFS计算迷宫最短路径)

      1000. Maze                       Time Limit: 1sec    Memory Limit:256MB Description Master Tang is kidnapped by a monster and put in a maze, and Mr. Sha wants to rescue him. The maze is an n*m matrix. There are two types rooms in the maze, 1 fo

bfs:求最短路径的长度

*/--> pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;}

迷宫最短路径

1226: 迷宫最短路径 时间限制: 1 Sec  内存限制: 128 MB 提交: 1  解决: 1 [提交][状态][讨论版]      [Edit]      [TestData] 题目描述 给定一个大小为N*M的迷宫.迷宫有通道和墙壁组成,每一步可以向上下左右是个方向移动.求起点到终点的最短路 M,N<=100. 输入 创建迷宫. 输出 输出最短路长度. 样例输入 10 10 #S######.# ......#..# .#.##.##.# .#........ ##.##.#### .

迷宫最短路径 问题

/* 迷宫最短路径 问题 */ #include<iostream> #include<queue> #include<cstring> using namespace std; struct Node{ int x, y; Node(int x,int y) { this->x = x; this->y = y; } }; const int N = 15; int map[9][9]= {1,1,1,1,1,1,1,1,1, 1,0,0,1,0,0,1,

蚁群算法求解迷宫最优路径问题

本段程序的基本思想是利用蚁群算法中的蚁周模型,来对全局的迷宫图进行信息素的跟新 和为每一只蚂蚁选择下一个方格. 一共会进行RcMax = 2000轮模拟(理论上模拟的次数越多结果 会越接近真实值),而在每一轮中会排除 M = 10只蚂蚁进行探路.同时在算法的回溯思想上采用的 是栈的数据结构来实现的.当栈最终为空时则表示无解.但同时这段程序的一缺点就是:由于我没在 算法中对每一轮的每只探路蚂蚁采用多线程的模式,所以整体的运行效率还不是很高.如读者有好的 思想或建议,请留言. #include<io

hdu1180诡异的楼梯……bfs走迷宫……wa了16次,我太渣了

#include<iostream> #include<queue> #include<cstring> using namespace std; int row,line,xx[4]={-1,1,0,0},yy[4]={0,0,-1,1}; char map[100][100]; bool vis[100][100]; struct node { int x,y,step; }st; void init() { int i,j; bool flag=1; for(i=

利用数据结构栈求解迷宫问题

本段程序主要利用数据结构栈的先进后出特点,实现回溯求解迷宫路径问题. #include<iostream> #include<stack> using namespace std; //坐标类 struct Point { int x; int y; }; //地图类 template<int A> struct Map { int (*p)[A]; int row;//行数 int col;//列数 }; //start起始点, end终止点 template<

利用栈求解迷宫问题

利用栈求解迷宫问题 源代码: #include<stdio.h> #include<stdlib.h> #define M 8 #define N 8 #define MaxSize M*N typedef struct { int i;//当前方块的行号 int j;//当前方块的列号 int di; //di是下一个可走的相邻方块的方位号 }Box; typedef struct { Box data[MaxSize]; int top;      //栈顶指针 }StType