题意
在矩阵中找连续字符形成的目标串(字符的上下左右的字符都是连续的)
题解
dfs。遍历矩阵,以每个为word[0]字符的起点开始查找,对于已经查找过的点用visited[i] = true来标记, 回溯时修改回visited[i] = false.
代码
class Solution {
public:
int n,m;
bool visited[1000][1000];
bool dfs(vector<vector<char> >&board, int x, int y, int index, string &word)
{
if(index == word.length())
return true;
else
{
//visited[x][y] = true;
for(int i = -1; i <= 1; i++)
{
if( i == 0)
continue;
if( x + i >= 0 && x + i < n && !visited[x + i][y] && board[x + i][y] == word[index])
{
visited[x + i][y] = true;
if(dfs(board, x + i, y, index + 1, word))
return true;
else
visited[x + i][y] = false;
}
if(y + i >= 0 && y + i < m && !visited[x][y + i] && board[x][y + i] == word[index])
{
visited[x][y + i] = true;
if(dfs(board, x , y + i, index + 1, word))
return true;
else
visited[x][y + i] = false;
}
}
return false;
}
}
void init(int n, int m, bool flag)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
visited[i][j] = flag;
}
}
bool exist(vector<vector<char>>& board, string word) {
n = board.size(), m = board[0].size();
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
if(board[i][j] == word[0])
{
//fill((bool *)visited, (bool *)visited + n * m , false);
init(n, m, false);
visited[i][j] = true;
if(dfs(board, i, j, 1, word))
return true;
}
}
}
return false;
}
};