21xrx.com
2024-12-23 00:13:24 Monday
登录
文章检索 我的文章 写文章
C++中如何实现地图遍历
2023-06-26 18:04:24 深夜i     --     --
C++ 地图遍历 算法 数据结构 路径规划

地图遍历是计算机科学中经典的问题之一,也是学习算法和数据结构时常见的练习题。在C++语言中,可以使用不同的算法和数据结构来实现地图遍历,例如深度优先搜索(Depth First Search,DFS)和宽度优先搜索(Breadth First Search,BFS)等。本文将介绍如何在C++语言中实现地图遍历。

1. 深度优先搜索(DFS)

DFS算法是一种递归算法,通过对图或树的节点依次访问并标记来实现遍历。在地图遍历中,DFS算法从起点开始,依次访问其相邻节点,直到访问到终点或者无法继续访问为止。具体实现可以使用递归函数或者栈来实现。以下是使用栈实现的DFS算法代码示例:


#include <iostream>

#include <stack>

using namespace std;

const int MAXN = 100;  // 地图的最大大小

int n, m;        // 地图的大小

char map[MAXN][MAXN];  // 地图

bool vis[MAXN][MAXN];  // 标记数组

int sx, sy;       // 起点坐标

int tx, ty;       // 终点坐标

// 四个方向移动的偏移量

int dx[4] = -1;

int dy[4] = 0 ;

// DFS函数

bool DFS(int x, int y)

{

  if (x == tx && y == ty)

    return true;  // 到达终点

  vis[x][y] = true;  // 标记已访问

  for (int i = 0; i < 4; ++i) {     

    int nx = x + dx[i];   // 新的x坐标

    int ny = y + dy[i];   // 新的y坐标

    if (nx < 0 || nx >= n || ny < 0 || ny >= m)

      continue;      // 越界跳过

    

    if (vis[nx][ny] || map[nx][ny] == '#')

      continue;      // 已访问或者障碍跳过

       

    if (DFS(nx, ny)) 返回true

    

  }

  return false;        // 无法到达终点,返回false

}

int main()

{

  // 读入地图

  cin >> n >> m;

  for (int i = 0; i < n; ++i) {

    for (int j = 0; j < m; ++j) {

      cin >> map[i][j];

      if (map[i][j] == 'S')

        sx = i;

        sy = j;     // 找到起点坐标

      

      else if (map[i][j] == 'G')

        tx = i;

        ty = j;     // 找到终点坐标

      

    }

  }

  // DFS遍历地图

  if (DFS(sx, sy)) 输出Yes

  

  else 输出No

  

  return 0;

}

2. 宽度优先搜索(BFS)

BFS算法是一种基于队列的搜索算法,从起点开始,依次将其相邻节点入队,然后访问队列中的节点并标记,直到访问到终点或者队列为空。在地图遍历中,BFS算法可以求出起点到终点的最短路径。以下是使用队列实现的BFS算法代码示例:


#include <iostream>

#include <queue>

using namespace std;

const int MAXN = 100;  // 地图的最大大小

int n, m;        // 地图的大小

char map[MAXN][MAXN];  // 地图

bool vis[MAXN][MAXN];  // 标记数组

int sx, sy;       // 起点坐标

int tx, ty;       // 终点坐标

// 四个方向移动的偏移量

int dx[4] = 1 ;

int dy[4] = -1;

// BFS函数

int BFS(int x, int y)

{

  queue<pair<int, int>> q;

  q.push( y );  // 将起点加入队列

  vis[x][y] = true;  // 标记已访问

  int step = 0;    // 记录步数

  while (!q.empty()) {

    int len = q.size();

    for (int i = 0; i < len; ++i) {

      auto p = q.front(); q.pop();

      for (int j = 0; j < 4; ++j) {

        int nx = p.first + dx[j];  // 新的x坐标

        int ny = p.second + dy[j]; // 新的y坐标

        if (nx < 0 || nx >= n || ny < 0 || ny >= m)

          continue;        // 越界跳过

        

        if (vis[nx][ny] || map[nx][ny] == '#')

          continue;        // 已访问或者障碍跳过

        

        if (nx == tx && ny == ty) {

          return step + 1;    // 到达终点,返回步数

        }

        q.push( nx);     // 加入队列

        vis[nx][ny] = true;     // 标记已访问

      }

    }

    ++step;               // 增加步数

  }

  return -1;               // 无法到达,返回-1

}

int main()

{

  // 读入地图

  cin >> n >> m;

  for (int i = 0; i < n; ++i) {

    for (int j = 0; j < m; ++j) {

      cin >> map[i][j];

      if (map[i][j] == 'S')

        sx = i;

        sy = j;         // 找到起点坐标

      

      else if (map[i][j] == 'G')

        tx = i;

        ty = j;         // 找到终点坐标

      

    }

  }

  // BFS遍历地图

  int res = BFS(sx, sy);

  if (res != -1)

    cout << res << endl;      // 可以到达

  else 输出No

  

  return 0;

}

综上所述,本文介绍了C++中实现地图遍历的两种算法,DFS和BFS。读者可以根据不同的需求选择不同的算法来解决问题。此外,还可以使用其他算法和数据结构来实现地图遍历,例如A*算法、Dijkstra算法等,读者可以自行学习研究。

  
  

评论区

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