21xrx.com
2025-04-13 11:00:28 Sunday
文章检索 我的文章 写文章
C++迷宫问题代码实现
2023-07-07 19:16:51 深夜i     306     0
C++ 迷宫问题 代码实现 算法 DFS

迷宫问题是计算机科学中经典的算法问题之一。本文将介绍如何使用C++语言来实现一个简单的迷宫问题解决方案。

迷宫问题可以被定义为寻找从起点到终点的最短路径。在迷宫中,有一些墙壁,标记为1,可以阻挡人的移动。有一些开放的空地,标记为0,人可以通过。为了解决该问题,我们需要使用图论来表示迷宫,用BFS或DFS等算法来搜索路径。

那么如何在C++中实现这个算法?首先,我们需要定义迷宫的类。该类包含三个主要元素:地图、起点、终点。

class Maze
{
private:
  // 迷宫地图
  vector< vector<int> > map_;
  // 起点和终点
  Point start_, end_;
public:
  // 构造函数
  Maze(const vector< vector<int> >& map, const Point& start, const Point& end);
  // 解决方案
  vector<Point> solve() const;
};

该类中的属性是地图、起点和终点。map_是一个二维矢量,表示迷宫地图。start_和end_是起点和终点的坐标,它们都是Point类型的对象。

接下来,我们需要实现构造函数和解决方案函数。

Maze::Maze(const vector< vector<int> >& map, const Point& start, const Point& end)
  : map_(map), start_(start), end_(end)
vector<Point> Maze::solve() const
{
  // 定义一个队列并将起点加入队列
  queue<Point> q;
  q.push(start_);
  // 定义一个标志矢量用于标记是否已经访问过某个点
  vector< vector<bool> > visited(map_.size(), vector<bool>(map_[0].size(), false));
  // 定义一个操作矢量用于记录搜索路径
  vector< vector<Point> > ops(map_.size(), vector<Point>(map_[0].size()));
  while (!q.empty())
  {
    // 取队列首位
    Point p = q.front();
    q.pop();
    // 如果已到达终点,返回解决方案
    if (p == end_)
    {
      vector<Point> path;
      path.push_back(p);
      // 从操作矢量中获取路径
      while (p != start_)
      {
        p = ops[p.x()][p.y()];
        path.push_back(p);
      }
      reverse(path.begin(), path.end());
      return path;
    }
    // 否则将p标记为已访问
    visited[p.x()][p.y()] = true;
    // 尝试向四个方向搜索
    for (const auto& dir : Direction::Left)
    {
      Point next = p.move(dir);
      // 判断next是否越界或者为墙
      if (!next.isInside(map_) || map_[next.x()][next.y()] == 1)
      
        continue;
      
      // 如果next还没访问过,将其加入队列,并在操作矢量中记录该操作
      if (!visited[next.x()][next.y()])
      {
        q.push(next);
        ops[next.x()][next.y()] = p;
      }
    }
  }
  // 如果搜索不到路径,返回空向量
  return vector<Point>();
}

在solve()函数中,我们使用BFS算法来搜索路径。基本上,该函数首先为起点创建一个队列,然后从队列中取出一个元素,并向四个方向搜索相邻点,如果是空地并且没有标记为已访问,就将其加入队列,并在操作矢量中记录该操作。如果队列为空,说明没有找到路径,返回空向量。如果找到路径,则从操作矢量中获取路径并返回。

最后,我们需要创建一个迷宫示例并使用solve()函数来解决迷宫问题。

int main()
{
  // 创建迷宫地图和起点终点
  vector< vector<int> > maze = {
     1,
     0 ,
     1,
     1,
     0,
  };
  Point start = 0 ;
  Point end = 4;
  // 创建迷宫对象并解决迷宫问题
  Maze mazeObj(maze, start, end);
  vector<Point> path = mazeObj.solve();
  // 输出路径
  for (const auto& p : path)
  {
    cout << "(" << p.x() << ", " << p.y() << ")" << endl;
  }
  return 0;
}

上述程序创建了一个5x5的迷宫,起点是左上角,终点是右下角。最后,程序输出了从起点到终点的路径:

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(3, 1)
(4, 1)
(4, 2)
(4, 3)
(4, 4)

这条路径是从左上角出发,经过若干个空地和墙,最后到达右下角的最短路径。经过程序的运行,我们可以看到C++可以非常方便地解决迷宫问题。

  
  

评论区

    相似文章
请求出错了