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