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, 注意不要搞混, 如果写错了调试起来有点头疼