LeetCode 130. 被围绕的区域 (DFS)
题目链接:https://leetcode-cn.com/problems/surrounded-regions/
给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。
找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。
示例:
X X X X
X O O X
X X O X
X O X X
运行你的函数后,矩阵变为:
X X X X
X X X X
X X X X
X O X X
解释:
被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
思路:先对边缘进行判断,将边缘部分能够相连的变为O其他的都为X.
1 int dx[4]={1,-1,0,0}; 2 int dy[4]={0,0,1,-1}; 3 void dfs(char** grid, int gridSize, int* gridColSize,int x,int y) 4 { 5 int i,j; 6 grid[x][y]='0'; 7 for(i=0;i<4;i++){ 8 int nx=x+dx[i],ny=y+dy[i]; 9 if(nx>=0&&nx<gridSize&&ny>=0&&ny<gridColSize[0]&&grid[nx][ny]=='O'){ 10 grid[nx][ny]='0'; 11 dfs(grid,gridSize,gridColSize,nx,ny); 12 } 13 } 14 return ; 15 } 16 void solve(char** board, int boardSize, int* boardColSize){ 17 if(board==NULL||boardSize==0) return ; 18 int i,j; 19 for(i=0,j=0;i<boardSize;i++){ 20 if(board[i][j]=='O'){ 21 dfs(board,boardSize,boardColSize,i,j); 22 } 23 } 24 for(i=0,j=boardColSize[0]-1;i<boardSize;i++){ 25 if(board[i][j]=='O'){ 26 dfs(board,boardSize,boardColSize,i,j); 27 } 28 } 29 for(j=0,i=0;j<boardColSize[0];j++){ 30 if(board[i][j]=='O'){ 31 dfs(board,boardSize,boardColSize,i,j); 32 } 33 } 34 for(j=0,i=boardSize-1;j<boardColSize[0];j++){ 35 if(board[i][j]=='O'){ 36 dfs(board,boardSize,boardColSize,i,j); 37 } 38 } 39 for(i=0;i<boardSize;i++){ 40 for(j=0;j<boardColSize[0];j++){ 41 if(board[i][j]=='O'){ 42 board[i][j]='X'; 43 }else if(board[i][j]=='0'){ 44 board[i][j]='O'; 45 } 46 } 47 } 48 }