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;}