1559. 二维网格图中探测环

1559. 二维网格图中探测环

给你一个二维字符网格数组 grid ,大小为 m x n ,你需要检查 grid 中是否存在 相同值 形成的环。

一个环是一条开始和结束于同一个格子的长度 大于等于 4 的路径。对于一个给定的格子,你可以移动到它上、下、左、右四个方向相邻的格子之一,可以移动的前提是这两个格子有 相同的值 。

同时,你也不能回到上一次移动时所在的格子。比方说,环 (1, 1) -> (1, 2) -> (1, 1) 是不合法的,因为从 (1, 2) 移动到 (1, 1) 回到了上一次移动时的格子。

如果 grid 中有相同值形成的环,请你返回 true ,否则返回 false 。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解题代码如下:
主要还是深度优先遍历,然后我们需要探讨是不是在遍历过程中,碰到之前遍历过的结点。如果碰到了说明出现了环。

int judez;
void dfs(char** grid,int n,int m, int now_r,int now_c,int **judge_search,char now_ch,int init_r,int init_c,int count,int fx,int fy){
    int direciton[4][2]={{-1,0},{1,0},{0,-1},{0,1}};


    
    for( int i=0;i<4;i++){
        int noe_r=now_r+direciton[(i+count)%4][0];
        int noe_c=now_c+direciton[(i+count)%4][1];
         if(noe_r==init_r&&noe_c==init_c&&count>=3){
                  judez=1;
                }
            if(0<=noe_r&&noe_r<n&&0<=noe_c&&noe_c<m&&noe_r!=fx&&noe_c!=fy&&grid[noe_r][noe_c]==now_ch&&judge_search[noe_r][noe_c]==0){
            judez=1;
            break;

            }
              

        if(0<=noe_r&&noe_r<n&&0<=noe_c&&noe_c<m&&judge_search[noe_r][noe_c]==1&&grid[noe_r][noe_c]==now_ch){
            
            judge_search[noe_r][noe_c]=0;
            

           
                if(judez==0)
            dfs(grid, n, m,  noe_r, noe_c, judge_search, now_ch, init_r, init_c,count+1, now_r, now_c);
        }

        

    
    }

}

bool containsCycle(char** grid, int gridSize, int* gridColSize){
    int n=gridSize;
    int m=gridColSize[0];
    int **judge_search=(int **)malloc(sizeof(int *)*n);
    for(int i=0;i<n;i++){
        judge_search[i]=(int *)malloc(sizeof(int )*m);
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            judge_search[i][j]=1;
        }
    }
//     for(int i=0;i<n;i++){
//         for(int j=0;j<m;j++){
// printf("%d ",judge_search[i][j]);        
// }
//     }
    judez=0;
   for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(judez==1){
                break;
            }
            if( judge_search[i][j]==1){
                judge_search[i][j]=0;
               dfs(grid, n, m, i, j, judge_search, grid[i][j], i, j,0,-1,-1);
                 
                        

            }
        }
    }
if(judez==1){return true;}
return false;




}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值