字母迷宫游戏初始界面记作 m x n 二维字符串数组 grid,请判断玩家是否能在 grid 中找到目标单词 target。
注意:寻找单词时 必须 按照字母顺序,通过水平或垂直方向相邻的单元格内的字母构成,同时,同一个单元格内的字母 不允许被重复使用 。

示例 1:
**输入:**grid = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], target = “ABCCED”
**输出:**true
示例 2:
**输入:**grid = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], target = “SEE”
**输出:**true
示例 3:
**输入:**grid = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], target = “ABCB”
**输出:**false
提示:
m == grid.length
n = grid[i].length
1 <= m, n <= 6
1 <= target.length <= 15
grid 和 target 仅由大小写英文字母组成
遍历矩阵,分别以每个字母为首字母再递归进行匹配。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class Solution { public: bool wordPuzzle(vector<vector<char>> &grid, string target) { if (grid.empty() || grid[0].empty()) { return false; } int h = grid.size(); int w = grid[0].size(); vector<vector<bool>> flag(h, vector<bool>(w)); for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { if (dfs(grid, i, j, flag, target, 0)) { return true; } } } return false; } bool dfs(vector<vector<char>> &grid, int i, int j, vector<vector<bool>> &flag, string &target, int index) { if (grid[i][j] != target[index]) return false; else if (index == target.size() - 1) return true; flag[i][j] = true; vector<pair<int, int>> directions{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; bool res = false; for (const auto &dir : directions) { int ni = i + dir.first, nj = j + dir.second; if (ni >= 0 && ni < grid.size() && nj >= 0 && nj < grid[0].size()) { if (!flag[ni][nj]) { res = dfs(grid, ni, nj, flag, target, index + 1); if (res) { break; } } } } flag[i][j] = false; return res; } };
|