###### tags: `LeetCode` `Recursion` `DFS` `String` `Medium`
# LeetCode #79 [Word Search](https://leetcode.com/problems/word-search/)
### (Medium)
給定一個 m x n 二維字符網格 board 和一個字符串單詞 word 。如果 word 存在於網格中,返回 true ;否則,返回 false 。
單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重複使用。
---
先在整個二維數組中尋找符合第一個字母的位置, 並在該處開始進行遞迴呼叫。
每當找到符合的字母時, 只需遞迴呼叫該位置的上下左右位置即可; 而當負責標示現在尋找的字母的指針大小等於給定字串長度時, 代表完成搜索, 此時回傳true。
此外, 在遞迴呼叫前將現在點的字元設為#, 並在呼叫後還原成原本的內容, 以避免重複探索。
注意邊界條件避免溢位。
---
```
//208ms, faster than 82.78%
class Solution {
public:
bool exist(vector<vector<char>>& board, string& word) {
for(int i=0;i<board.size();i++){
for(int j=0;j<board[0].size();j++){
if(dfs(board, word, i, j, 0))return true;
}
}
return false;
}
bool dfs(vector<vector<char>>& board, string& word, int i, int j, int pos){
if(i<0||j<0||i==board.size()||j==board[0].size()||board[i][j]!=word[pos])return false;
if(pos==word.size()-1)return true;
if(board[i][j]==word[pos]){
char c=board[i][j];
board[i][j]='#';
if(dfs(board, word, i-1, j, pos+1))return true;
else if(dfs(board, word, i, j+1, pos+1))return true;
else if(dfs(board, word, i+1, j, pos+1))return true;
else if(dfs(board, word, i, j-1, pos+1))return true;
board[i][j]=c;
}
return false;
}
};
```