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 }

 

posted @ 2020-03-13 09:13  wydxry  阅读(247)  评论(0编辑  收藏  举报
Live2D