《剑指offer》
面试题12
这个题目主要考回溯,写的时候要注意的地方首先定下来dfs的状态集,也就是dfs函数的参数。
class Solution {
public:
int vis[205][205];
bool ok;
int rowlen, columnlen;
bool checkBorder(int row, int column)
{
if(row>=rowlen || column>=columnlen) return false;
if(row<0 || column<0) return false;
return true;
}
void dfs(vector<vector<char>>& board, string word, int step, int row, int column)
{
int dir[][2] = {0,-1, 0,1 ,-1,0, 1,0};
vis[row][column] = true;
if(step == word.size()-1)
{
ok = true;
return;
}
for(int i=0; i<4; i++)
{
int nrow = row + dir[i][0];
int ncolumn = column + dir[i][1];
if(checkBorder(nrow, ncolumn) && board[nrow][ncolumn]==word[step+1]
&& !vis[nrow][ncolumn])
{
dfs(board, word, step+1, nrow, ncolumn);
if(ok == true)
return ;
vis[nrow][ncolumn] = 0;
}
}
return ;
}
bool exist(vector<vector<char>>& board, string word) {
rowlen = board.size();
columnlen = board[0].size();
for(int i=0; i<rowlen; i++)
{
for(int j=0; j<columnlen; j++)
{
if(board[i][j]==word[0])
{
memset(vis,0,sizeof(vis));
ok = false;
dfs(board, word, 0, i, j);
if(ok == true)
{
return ok;
}
}
}
}
return ok;
}
};