【剑指offer】面试题12. 矩阵中的路径

题目描述:

在这里插入图片描述

解题思路:

(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值