题目描述:
解题思路:
(1)遍历board矩阵找到 board[row][col] == word[0],从(row,col)开始进入搜索,(既进入一个函数,功能是寻找是否存在从(row,col)开始于word相同的路径,传入参数 bord ,bordsize,boardcolsize,row,col,以及另一个矩阵arr,(arr下边会介绍))。
(2)此时与(row,col)相邻可能有四个元素,逐个(按一定顺序)与word[1]比较
若有相等从相等的元素(例如右边元素(row,col + 1)),重复2操作,既再次开始进入搜索与word[2]进行比较直到word[n] == ‘\0’;返回(true)。
若没有相等的元素,直接返回(false) .
需要注意的是:(2)操作中不一定相邻不一定有四个元素,要防止数组越界。还要保证找到相等的元素以前没有经过过。为了实现这一功能创建二维数组arr[][]大小和board一样,初始全部置0,若经过了就对应坐标置1。
具体代码:
bool _exist(char** board, int boardSize, int boardColSize, char* word,int row,int col,int** arr){
//搜索函数
bool result = false;
if(*word == '\0'){
return true;
}
if(row + 1 < boardSize && board[row + 1][col] == *word && arr[row + 1][col] == 0){
//判断下边的元素
arr[row][col] = 1;
result = _exist(board,boardSize,boardColSize,word + 1,row + 1,col,arr);
arr[row][col] = 0;
}
if(col + 1 < boardColSize && board[row][col + 1] == *word && !result && arr[row][col + 1] == 0){
//判断右边的元素是否相等
arr[row][col] = 1;
result = _exist(board,boardSize,boardColSize,word + 1,row,col + 1,arr);
arr[row][col] = 0;
}
if(col - 1 >= 0 && board[row][col - 1] == *word && !result && arr[row][col - 1] == 0){
//判断左边元素
arr[row][col] = 1;
result = _exist(board,boardSize,boardColSize,word + 1,row,col - 1,arr);
arr[row][col] = 0;
}
if(row - 1 >= 0 && board[row - 1][col] == *word && !result && arr[row - 1][col] == 0){
//判断上边
arr[row][col] = 1;
result = _exist(board,boardSize,boardColSize,word + 1,row - 1,col,arr);
arr[row][col] = 0;
}
return result;
}
bool exist(char** board, int boardSize, int* boardColSize, char* word){
bool tem = false;
int** arr = (int **)malloc(sizeof(int *) * boardSize);//定义矩阵arr用于记录已走路径(走了为1,没有0)
for(int i = 0; i < boardSize;i++){
arr[i] = (int*)malloc(sizeof(int) * (*boardColSize));
memset(arr[i], 0, sizeof(int) * (*boardColSize));//arr[i][0]-arr[i][boardColSize - 1] 全部置0
}
for (int row = 0; row < boardSize;row ++){//遍历矩阵
for(int col = 0; col < (*boardColSize);col ++){
if(board[row][col] == *word){
if(_exist(board,boardSize,*boardColSize,word + 1,row,col,arr)){
tem = true;
}
}
}
}
return tem;
}