核心思路 用双重循环以所有的位置都作为起始点开始遍历
设置边界条件 上下左右都搜一次,不合适就回来,二叉树思想
经过的结点设置"#'避免重复搜索导致数据混乱
递归完后要还原原字符
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>using namespace std;bool check = false;void bracktracking(vector<vector<char>>& board, int x, int y, int x_m, int y_m, int len, int c, string word)
{if (check)return;if (x == x_m || x == -1)return;if (y == y_m || y == -1)return;
//非引用数组的边界条件放最前面,防止越界char m = board[x][y];//存储字符,用于还原if (board[x][y] == '#')return;if (board[x][y] != word[c])return;else{board[x][y] = '#';//标记已经过c++;if (c == len){check = true;}}bracktracking(board, x, y + 1, x_m, y_m, len, c, word);bracktracking(board, x, y - 1, x_m, y_m, len, c, word);bracktracking(board, x+1, y, x_m, y_m, len, c,word);bracktracking(board, x-1, y , x_m, y_m, len, c, word);board[x][y] = m;//还原字符}bool exist(vector<vector<char>>& board, string word) {for (int i = 0;i < board.size();i++){for (int j = 0;j < board[i].size();j++){bracktracking(board, i, j,board.size(),board[i].size(),word.size(),0,word);}}return check;
}int main()
{std::vector<std::string> strs = { "ABCE", "SFCS", "ADEE" };std::vector<std::vector<char>> board;for (const auto& str : strs) {std::vector<char> row(str.begin(), str.end());board.push_back(row);}string word = "SEE";if (exist(board, word))cout << "找到了";elsecout << "没找到";cout << endl;for (auto n : board){for (int i = 0;i < n.size();i++)cout << n[i]<<" ";cout << endl;}return 0;
}