這道題之前一直沒敢做,沒想到前天用遞迴一遍過了。。
當時為什麼想著用遞迴,而不是dp呢,因為我想到達某個位置的情況有很多,即使從當前位置開始的搜尋是已知的,但之前的狀態是怎樣的也無從得知啊,實話實說,我是不會用dp解這個。。
遞迴的思路就好說多了,從當前點開始,有上下左右四個位置可以探測,如果探測成功的話,要把當前的位置用其他符號標記出來,以免重複訪問。實際上就是DFS嘛,只不過入口多一些。
需要注意的一點是,每個點都可以作為起點,所以這個要窮舉一下,否則會漏掉情況的。當然有一種情況走通就可以返回了,剪枝之。
代碼又臭又長,不過work:
class Solution {public: int row, column; bool doexist(vector<vector<char> > &board, string &word, int len, int i, int j){ if(len == word.length()) return true; bool res; if(i>0&&board[i-1][j] == word[len]){ board[i-1][j] = '.'; res = doexist(board, word, len+1, i-1, j); if(res) return true; else board[i-1][j] = word[len]; } if(i<row-1&&board[i+1][j] == word[len]){ board[i+1][j] = '.'; res = doexist(board, word, len+1, i+1, j); if(res) return true; else board[i+1][j] = word[len]; } if(j>0&&board[i][j-1] == word[len]){ board[i][j-1] = '.'; res = doexist(board, word, len+1, i, j-1); if(res) return true; else board[i][j-1] = word[len]; } if(j<column-1&&board[i][j+1] == word[len]){ board[i][j+1] = '.'; res = doexist(board, word, len+1, i, j+1); if(res) return true; else board[i][j+1] = word[len]; } return false; } bool exist(vector<vector<char> > &board, string word) { row = board.size(); if(row == 0) return false; column = board[0].size(); char c; for(int i=0;i<row;i++){ for(int j=0;j<column;j++){ if(board[i][j] == word[0]){ board[i][j] = '.'; if(doexist(board, word, 1, i, j)) return true; board[i][j] = word[0]; } } } return false; }};