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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| #include <vector> #include <string>
using std::vector; using std::string;
class Solution { private: bool __exit(vector<vector<char> > &board, vector<vector<bool> > &visited, string word, int curr_idx, int curri, int currj) { int m = board.size(), n = board[0].size(); bool ret;
if (curr_idx == word.size()) return true;
if (curri - 1 >= 0 && !visited[curri - 1][currj] && board[curri - 1][currj] == word[curr_idx]) { visited[curri - 1][currj] = true; ret = __exit(board, visited, word, curr_idx + 1, curri - 1, currj); visited[curri - 1][currj] = false; if (ret) return true; }
if (curri + 1 < m && !visited[curri + 1][currj] && board[curri + 1][currj] == word[curr_idx]) { visited[curri + 1][currj] = true; ret = __exit(board, visited, word, curr_idx + 1, curri + 1, currj); visited[curri + 1][currj] = false; if (ret) return true; }
if (currj - 1 >= 0 && !visited[curri][currj - 1] && board[curri][currj - 1] == word[curr_idx]) { visited[curri][currj - 1] = true; ret = __exit(board, visited, word, curr_idx + 1, curri, currj - 1); visited[curri][currj - 1] = false; if (ret) return true; }
if (currj + 1 < n && !visited[curri][currj + 1] && board[curri][currj + 1] == word[curr_idx]) { visited[curri][currj + 1] = true; ret = __exit(board, visited, word, curr_idx + 1, curri, currj + 1); visited[curri][currj + 1] = false; if (ret) return true; }
return false; }
public: bool exist(vector<vector<char> > &board, string word) {
int i, j, m = board.size(), n = board[0].size(); vector<vector<bool> > visited(m, vector<bool>(n, false));
for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { if (board[i][j] == word[0]) { visited[i][j] = true;
if (__exit(board, visited, word, 1, i, j)) return true;
visited[i][j] = false; } } }
return false; } };
|