1 class Solution {
 2     public void solve(char[][] board) {
 3         if(0==board.length||0==board[0].length)return;
 4         if(board.length<2||board[0].length<2)return;
 5         
 6         int height=board.length;
 7         int width=board[0].length;
 8         for(int i=0;i<height;++i)
 9         {
10             if('O'==board[i][0])
11                 boundary(board,i,0);
12             if('O'==board[i][width-1])
13                 boundary(board,i,width-1);
14         }
15         
16         for(int j=0;j<width;++j)
17         {
18             if('O'==board[0][j])
19                 boundary(board,0,j);
20             if('O'==board[height-1][j])
21                 boundary(board,height-1,j);
22         }
23         
24         for(int i=0;i<height;++i)
25             for(int j=0;j<width;++j)
26                 if(board[i][j]=='O')
27                     board[i][j]='X';
28                 else if(board[i][j]=='*')
29                     board[i][j]='O';
30     }
31     
32     void boundary(char [][]board, int i, int j)
33     {
34         if(i<0||i>board.length-1||j<0||j>board[0].length-1)
35             return;
36         if('O'==board[i][j])
37             board[i][j]='*';
38         if(i>1&&board[i-1][j]=='O')
39             boundary(board,i-1,j);
40         if(i<board.length-2&&board[i+1][j]=='O')
41             boundary(board,i+1,j);
42         if(j>1&&board[i][j-1]=='O')
43             boundary(board,i,j-1);
44         if(j<board[i].length-2&&board[i][j+1]=='O')
45             boundary(board,i,j+1);
46     }
47 }

 

dfs问题. 来自讨论区答案

X包围O, 包围的部分用X更新, 边界不算包围, 所以思路是从四条边开始找O, 把O替换为* 进行染色, 染色完之后剩下的O自然就是要被更新为X的部分. 再把*还原

注意几个问题

1 这题没说是否可以修改原数组, java给的是数组没有final修饰, cpp给的是引用参数, 都可以修改, 理论上讲用了额外空间0(n).

2 如何fs? 四个方向,哪个方向有O就往哪边走

3 其实思路没有什么特别难的,但是这种问题写出代码就是一大堆,确实有点恼火, 而且四个方向, i和j, 注意不要搞混, 如果写错了调试起来有点头疼