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
| class Solution { bool dfs(vector<vector<bool>>& avail,vector<vector<char>>& board, string word,int index,int si,int sj) { if (index == word.length())return true; char k = word[index]; bool flag[4] = { 0,0,0,0 }; if (avail[si - 1][sj] && board[si - 1][sj] == k) { avail[si - 1][sj] = false; flag[0]=dfs(avail,board, word, index + 1, si - 1, sj); if (flag[0]) return true; avail[si - 1][sj] = true; } if (avail[si][sj - 1] && board[si][sj - 1] == k) { avail[si][sj - 1] = false; flag[1] = dfs(avail,board, word, index + 1, si, sj - 1); if (flag[1]) return true; avail[si][sj - 1] = true; } if (avail[si + 1][sj] && board[si + 1][sj] == k) { avail[si + 1][sj] = false; flag[2] = dfs(avail,board, word, index + 1, si + 1, sj); if (flag[2]) return true; avail[si + 1][sj] = true; } if (avail[si][sj + 1]&&board[si][sj + 1] == k) { avail[si][sj + 1] = false; flag[3] = dfs(avail,board, word, index + 1, si, sj + 1); if (flag[3]) return true; avail[si][sj + 1] = true; } return false; } public: bool exist(vector<vector<char>>& board, string word) { int row = board.size(); int col = board[0].size(); for (int i = 0; i < row; i++) { board[i].insert(board[i].begin(),'#'); board[i].insert(board[i].end(), '#'); } vector<char> tmp; for (int i = 0; i < col + 2; i++) tmp.push_back('#'); board.insert(board.begin(), tmp); board.insert(board.end(), tmp);
int len = word.length(); if (len < 1)return false; char c = word[0]; vector<pair<int,int>> start; for (int i = 1; i <= row; i++) for(int j=1;j<=col;j++) if (board[i][j] == c) start.push_back(pair<int,int>(i,j));
vector<vector<bool>> avail; for (int i = 0; i < row + 2; i++) { vector<bool> t; for (int j = 0; j < col + 2; j++) t.push_back(true); avail.push_back(t); } for (int i = 0; i < start.size(); i++) { int index = 1; int si = start[i].first; int sj = start[i].second; avail[si][sj] = false; if (dfs(avail,board, word, 1, si, sj))return true; avail[si][sj] = true; } return false; } };
|