通过这道题目,加深了对backtracking的理解。
其实,就像武侠小说中说的,手中无剑,心中有剑。backtracking本来没有什么模式可言,题目不同,条件不同,那么程序自然也就不一样。当然在很多典型情况下还是有模板的,但是,本题却不好利用模板。没有显而易见的isValid函数,当然该递归还是递归的。
那么真正以不变应万变的是什么?丰富的经验,明确的思路,大概才是王道吧。
class Solution
{
public:
bool existHelper(vector<vector<char> > &board, string word, int row,
int column)
{
int row_max = board.size() - 1;
int column_max = board[0].size() - 1;
if (word.empty())
return true; //edge case, we have found all the word
if (row > 0 && board[row - 1][column] == word[0])
{
char temp = word[0]; //save the char
board[row - 1][column] = ' ';
if (existHelper(board, word.substr(1), row - 1, column))
return true;
board[row - 1][column] = temp;
}
if (column != 0 && board[row][column - 1] == word[0])
{
char temp = word[0]; //save the char
board[row][column - 1] = ' ';
if (existHelper(board, word.substr(1), row, column - 1))
return true;
board[row][column - 1] = temp;
}
if (row < row_max && board[row + 1][column] == word[0])
{
char temp = word[0]; //save the char
board[row + 1][column] = ' ';
if (existHelper(board, word.substr(1), row + 1, column))
return true;
board[row + 1][column] = temp;
}
if (column < column_max && board[row][column + 1] == word[0])
{
char temp = word[0]; //save the char
board[row][column + 1] = ' ';
if (existHelper(board, word.substr(1), row, column + 1))
return true;
board[row][column + 1] = temp;
}
return false; //have tried all the possiblities
}
bool exist(vector<vector<char> > &board, string word)
{
if (word.empty())
return true; //always true for empty word
if (board.empty())
return false; // always false if board is empty
unsigned int row, column;
for (row = 0; row < board.size(); row++)
for (column = 0; column < board[0].size(); column++)
{
if (board[row][column] == word[0])
{
char temp = board[row][column];
board[row][column] = ' '; //assign a temp blank to the position
if (existHelper(board, word.substr(1), row, column))
return true;
board[row][column] = temp;
}
}
return false; //cannot find the first element
}
};