剑指 Offer 12. 矩阵中的路径-c语言dfs解题

剑指 Offer 12. 矩阵中的路径

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。

示例 1:

输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true

示例 2:

输入:board = [[“a”,“b”],[“c”,“d”]], word = “abcd”
输出:false

这是第二次碰到这个题目了,第一次时,自己没做出来,但是这次仅仅五次调试就做出来了,所以刷力扣的同学,要坚持下去,一定会有收获。

int direction[4][2]={{0,1},{1,0},{0,-1},{-1,0}};

void dfs(char** board,int prex,int prey,int cux,int cuy,int po,char *word,int xmax,int ymax,int len,int *r, int **ar){
    if(po==len){
        *r=1;
    }
    if(*r!=1){
        int i;
        for(i=0;i<4;i++){
            int x=cux+direction[i][0];
            int y=cuy+direction[i][1];
            if(x==prex&&y==prey){
                continue;
            }
            if(x>=0&&x<=ymax&&y>=0&&y<=xmax&&board[x][y]==word[po]&&ar[x][y]==0){
            ar[x][y]=1;
                dfs(board,cux,cuy,x,y,po+1,word,xmax,ymax,len,r,ar);
             ar[x][y]=0;

            }
        }


    }
   

}
bool exist(char** board, int boardSize, int* boardColSize, char* word){
    int xmax=boardColSize[0]-1;
    int ymax=boardSize-1;
    int *r=(int *)malloc(sizeof(int));
    int **ar=(int **)malloc(sizeof(int*)*boardSize);
    *r=0;
    int len=strlen(word);
    int i,j;
    for(i=0;i<boardSize;i++){
        ar[i]=(int *)malloc(sizeof(int)*boardColSize[0]);
    }
      for(i=0;i<boardSize;i++){
      for(j=0;j<boardColSize[0];j++){
          ar[i][j]=0;
      }
    }


    for(i=0;i<=ymax;i++){
        for(j=0;j<=xmax;j++){
           
            if(board[i][j]==word[0]){
                ar[i][j]=1;
               dfs(board,-1,-1,i,j,1,word,xmax,ymax,len,r,ar);
               ar[i][j]=0;
            }
             if(*r==1){
                return true;
            }
        }
    }
     return false;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值