思路
很明显,只有与边界上的O连接的O才不会X覆盖
解题方法
检测边界上的字符,如果是O则向周围探测,访问与之连接的不会被覆盖的X。边界探测结束后,没有访问过的O皆会被X覆盖
Code
class Solution {public int dir[][]={{0,1},{0,-1},{1,0},{-1,0}};public boolean vis[][];public char[][] map;public int m;public int n;public void solve(char[][] board) {m=board.length;n=board[0].length;map=board;vis=new boolean[m][n];for(int i=0;i<m;i++){dfs(i,0);dfs(i,n-1);}for(int i=1;i<n-1;i++){dfs(0,i);dfs(m-1,i);}for(int i=0;i<m;i++){for(int j=0;j<n;j++){board[i][j]='X';}}for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(map[i][j]=='X'&&vis[i][j]){board[i][j]='O';}}}}void dfs(int x,int y){if(map[x][y]=='X') return;vis[x][y]=true;for(int i=0;i<4;i++){int newx=x+dir[i][0];int newy=y+dir[i][1];if(0<=newx&&newx<m&&0<=newy&&newy<n&&map[newx][newy]=='O'&&!vis[newx][newy]){dfs(newx,newy);}}}
}