这道题虽然简单,但是我尝试用了非广度遍历,想来点其他思路的方法,都失败在一些测试用例了,所以这道题感觉用广度遍历,是最容易解决的方法,以及这道题,让我想起了以前学习写游戏编写的寻路算法or最短寻路算法,而且这次的代码简洁,感觉挺好看的…
题目简介:
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = “ABCCED”, 返回 true.
给定 word = “SEE”, 返回 true.
给定 word = “ABCB”, 返回 false.
题解:
思路是广度遍历,注意的是如何解决搜索重复路径。
class Solution {
public:
vector<vector<int>>dic = { {0,1},{0,-1},{1,0},{-1,0} };
int row, col;
int **map;
~Solution() {
if (map) {
for (int i = 0; i < row; i++)
delete[] map[i];
delete[] map;
}
}
bool exist(vector<vector<char>>& board, string word) {
row = board.size(), col = board[0].size();
map = new int*[row];
for (int i = 0; i < row; i++)
map[i] = new int[col];
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
map[i][j] = -1;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
bool fuck=op(board, word, map, i, j, 0);
if (fuck)
return true;
map[i][j] == -1;
}
}
return false;
}
bool op(vector<vector<char>>& vec, string &word, int **map,int x,int y,int pos) {
if (y<0||x<0||x >= row || y >= col || pos > word.length() - 1)
return false;
if (vec[x][y] != word[pos]|| map[x][y] != -1)
return false;
if (vec[x][y] == word[pos] && pos == word.length()-1) {
map[x][y] = pos;
return true;
}
map[x][y] = pos;
for (auto i : dic) {
int tx = i[0] + x;
int ty = i[1] + y;
bool fk = op(vec, word, map, tx, ty, pos + 1);
if (fk)
return true;
}
map[x][y] = -1;
return false;
}
};