21xrx.com
2024-11-05 14:56:38 Tuesday
登录
文章检索 我的文章 写文章
C++迷宫问题代码实现
2023-07-07 19:16:51 深夜i     --     --
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++可以非常方便地解决迷宫问题。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复