leetcode 79:單詞搜尋
阿新 • • 發佈:2018-12-14
本題算是一個組合類的題,也類似於深度優先搜尋演算法
設定一個與字母構成的陣列大小相同的陣列,用來儲存某個位置的字母是否被訪問過,標註為1表示已被訪問過,避免重複
每次要看i,j位置上下左右的字母是否等於單詞第t個位置的字母 ,進行深度優先搜尋
bool find(std::vector<std::vector<char>>& board,std::string word,int i,int j,int t,std::vector<int>&m1, std::vector<int>&n1,std::vector<std::vector<int>> &c){ if(i-1>=0){ if(board[i-1][j]==word[t]&&c[i-1][j]==0) { if (t == word.size()-1) return true; else { m1.push_back(i-1); n1.push_back(j); c[i - 1][j] = 1; if(find(board, word, i - 1, j, t + 1,m1,n1,c)) return true; m1.pop_back(); n1.pop_back(); c[i-1][j]=0; } } } if(j-1>=0){ if(board[i][j-1]==word[t]&&c[i][j-1]==0) { if (t == word.size()-1) return true; else { m1.push_back(i); n1.push_back(j-1); c[i][j-1] = 1; if(find(board, word, i, j-1, t + 1,m1,n1,c)) return true; m1.pop_back(); n1.pop_back(); c[i][j-1]=0; } } } if(j+1<board[0].size()) { if(board[i][j+1]==word[t]&&c[i][j+1]==0) { if (t == word.size()-1) return true; else { m1.push_back(i); n1.push_back(j+1); c[i][j+1] = 1; if(find(board, word, i, j+1, t + 1,m1,n1,c)) return true; m1.pop_back(); n1.pop_back(); c[i][j+1]=0; } } } if(i+1<board.size()){ if(board[i+1][j]==word[t]&&c[i+1][j]==0) { if (t == word.size()-1) return true; else { m1.push_back(i+1); n1.push_back(j); c[i+1][j] = 1; if(find(board, word, i + 1, j, t + 1,m1,n1,c)) return true; m1.pop_back(); n1.pop_back(); c[i+1][j]=0; } } } c[i][j]=0; return false; } bool exist(std::vector<std::vector<char>>& board, std::string word) { if(board.size()==0) return false; std::vector<int> m; std::vector<int> n; for(int i=0;i<board.size();i++){ for(int j=0;j<board[0].size();j++){ if(board[i][j]==word[0]) { m.push_back(i); n.push_back(j); } } } std::vector<std::vector<int>> c; std::vector<int> v(board[0].size()); for(int i=0;i<board.size();i++) c.push_back(v); if(m.size()==0) return false; if(word.size()==1) return true; for(int k=0;k<m.size();k++){ int i=m[k]; int j=n[k]; c[i][j]=1; std::vector<int> m1; std::vector<int> n1; m1.push_back(i); n1.push_back(j); if(find(board,word,i,j,1,m1,n1,c)) return true; else c[i][j]=0; } return false; }