21xrx.com
2025-03-29 19:52:16 Saturday
文章检索 我的文章 写文章
C++深搜实现LETTERS121题解
2023-07-10 16:14:45 深夜i     11     0
C++ 深搜 LETTERS121 实现 题解

LETTERS121是一道经典的深度优先搜索(DFS)题。这道题目要求给定一个由大写字母组成的二维矩阵,找出其中包含最多不同字母的路径,并返回这些不同字母的数量。

对于这种基于DFS思想的问题,C++作为一门高效、稳定且拥有丰富STL库的语言,尤其适合处理。下面介绍如何使用C++实现LETTERS121题解。

首先,我们需要定义一个类来表示矩阵中的点,并提供一些需要用到的基本操作。这里我们将类定义为Point,包含x和y两个坐标,以及判断两个点是否相等的重载函数。

class Point {
public:
  int x, y;
  Point(int x = 0, int y = 0)
    this->x = x;
    this->y = y;
  
  bool operator==(const Point& other) const
    return this->x == other.x && this->y == other.y;
  
};

接下来,我们需要定义用于搜索的函数。具体来说,我们需要定义一个visited数组来记录已经访问过的点、一个mp数组来记录每个点对应的字符、一个path数组来记录当前的路径,还有一个maxLen变量来记录最长路径的长度,在搜索的过程中,对于该路径的每一步,我们都需要对其进行几种操作:

1.判断是否在限制条件下,决定是否进行搜索。

2.变更visited状态。

C++的定义方式为:

int maxLen = 0;
vector<char> path;
vector<vector<int>> visited;
vector<vector<char>> mp;
void dfs(const vector<vector<char>>& board, Point p, int len) {
  int m = board.size(), n = board[0].size();
  int dx[4] = 0;
  int dy[4] = 1;
  path.push_back(mp[p.x][p.y]);
  visited[p.x][p.y] = 1;
  maxLen = max(maxLen, len);
  for(int i = 0; i < 4; ++i) {
    int nx = p.x + dx[i];
    int ny = p.y + dy[i];
    if(nx < 0 || nx >= m || ny < 0 || ny >= n || visited[nx][ny]) continue;
    if(mp[p.x][p.y] == mp[nx][ny]) {
      dfs(board, Point(nx, ny), len + 1);
    } else {
      dfs(board, Point(nx, ny), len + 1);
    }
  }
  path.pop_back();
  visited[p.x][p.y] = 0;
}

其中,dx和dy是用来判断当前点四周点是否可行的变量;如果当前点四周点不可行,则直接continue;如果当前点四周点可行,则选择继续搜索。

最后,我们需要在主函数中调用dfs()函数,并返回最长路径的长度。

int longestPath(vector<vector<char>>& board) {
  int m = board.size(), n = board[0].size();
  visited.resize(m, vector<int>(n, 0));
  mp.resize(m, vector<char>(n, 0));
  maxLen = 0;
  for(int i = 0; i < m; ++i) {
    for(int j = 0; j < n; ++j) {
      mp[i][j] = board[i][j];
    }
  }
  for(int i = 0; i < m; ++i) {
    for(int j = 0; j < n; ++j) {
      dfs(board, Point(i, j), 1);
    }
  }
  return maxLen;
}

综上所述,这就是一种基于DFS思想的C++实现LETTERS121题解的方法。其中,定义对象、数组,以及使用一些内置函数都可以从STL中实现,提高了代码编写的效率。此题的实现代码由Alcwyn所提供,全文转载请注明出处。

  
  

评论区

请求出错了