21xrx.com
2024-09-20 05:51:17 Friday
登录
文章检索 我的文章 写文章
C++深搜实现LETTERS121题解
2023-07-10 16:14:45 深夜i     --     --
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所提供,全文转载请注明出处。

  
  

评论区

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