Leetcode 剑指 Offer 12 矩阵中的路径

39 篇文章 0 订阅
34 篇文章 0 订阅

这道题考察的是回溯算法
具体解题方法参考剑指offer 12.

P.S.

  1. calloc分配内存的时间消耗很大。
  2. 在迭代的时候,如果返回结果是false,需要把标定清楚。

内存和时间消耗以及源代码如下:
内存和时间消耗

bool existCore(char** board, int cols,  int rows,   char* word,
               int col,    int row, bool* visit,   int wordnum)
{
    bool    end =   false;
    if  (word[wordnum]=='\0')
    {
        return  true;
    }

    if  (row<0  ||  col<0   ||  row>=rows    ||  col>=cols)
    {
        return  false;
    }    

    if  (visit[row*cols +  col])
    {
        return  false;
    }

    if  (board[row][col]==word[wordnum])
    {
        visit[row*cols +  col] =   true;
        end =   existCore(board,    cols,   rows,   word,
                col+1,  row,    visit,  wordnum+1)||
                existCore(board,    cols,   rows,   word,
                col-1,  row,    visit,  wordnum+1)||
                existCore(board,    cols,   rows,   word,
                col,  row+1,    visit,  wordnum+1)||
                existCore(board,    cols,   rows,   word,
                col,  row-1,    visit,  wordnum+1);  
        
    }
    
    //一旦运行失败之前的标定不能有任何变化,所以visit需要清零
    if  (!end)
    {
        visit[row*cols +  col] =   false;
    }

    return  end;
    
    
}

bool exist(char** board, int boardSize, int* boardColSize, char* word){

    if  (board==NULL    ||  boardSize<1    ||  *boardColSize<1)
    {
        return false;
    }
    else    if  (word   ==  NULL)
    {
        return  true;
    }

    int col;
    int row;
    int cols =   *boardColSize;
    int rows =   boardSize;

    bool*    visit;
    visit   =   (bool*)malloc(cols*rows*sizeof(bool));
    // //visis可以用0or1来标定,这样可以直接用calloc来赋值,但是时间消耗很长
    // int*    visit;

    int wordnum;
        
    for (row=0;    row<rows;  row++)
    {
        for (col=0;   col<cols;  col++)
        {
            wordnum =   0;
            // visit   =   (int*)calloc(cols*rows,sizeof(int));

            for (int i=0;    i<rows;  i++)
            {
                for (int j=0;   j<cols;  j++)
                {
                    visit[i*cols  +   j] =   false;
                }
            } 

            if  (existCore(board, cols,  rows, word, col,
                row, visit, wordnum))
            {
                return true;
            }
        }
    }    

    return  false;    

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值