|

楼主 |
发表于 12-13-2014 09:24 PM
|
显示全部楼层
Surrounded Regions
思路:[eaglesky1990]
此题如果直接从surrouned regions入手用BFS或DFS都比较麻烦,因为不知道结果是终止于X还是边界上的O, 只有终止于X时才应该翻转O。更简单的思路是用排除法,先考虑那些没有被surrounded的O, 找他们比较简单,直接从边界上的O开始BFS或DFS遍历即可,把他们都变成'B'(啥mark都可以,只要别是'O'或'X'),然后遍历棋盘每个棋子,把遇到的'O'变成'X‘, ’B‘还原成'O'即可。
代码:
- public class Solution {
- public class Pair
- {
- int x;
- int y;
- Pair() {x =-1; y = -1;}
- Pair(int m, int n) {x=m;y=n;}
- }
- private void helper(char[][] board, int w, int l)
- {
- int width = board.length;
- int length = board[0].length;
- Deque<Pair> dq = new LinkedList<Pair>();
- dq.add(new Pair(w, l));
- board[w][l] = 'B';
- while(!dq.isEmpty())
- {
- Pair cur = dq.removeFirst();
- List<Pair> adjs = new ArrayList<Pair>();
- adjs.add(new Pair(cur.x - 1, cur.y));
- adjs.add(new Pair(cur.x + 1, cur.y));
- adjs.add(new Pair(cur.x, cur.y - 1));
- adjs.add(new Pair(cur.x, cur.y + 1));
- for(int i = 0; i < 4; ++i)
- {
- int adjW = adjs.get(i).x;
- int adjL = adjs.get(i).y;
- if(adjW >= 0 && adjW < width && adjL >= 0 && adjL < length && board[adjW][adjL] == 'O')
- {
- dq.add(new Pair(adjW, adjL));
- board[adjW][adjL] = 'B';
- }
- }
- }
- }
- public void solve(char[][] board) {
- int width = board.length;
- if(width == 0) return;
- int length = board[0].length;
- if(length == 0) return;
- for(int i = 0; i < length; ++i) //two vertical line
- {
- if(board[0]【i】 == 'O')
- helper(board, 0, i);
- if(board[width-1]【i】 == 'O')
- helper(board, width - 1, i);
- }
- for(int i = 0; i < width; ++i) //two horizontal line
- {
- if(board【i】[0] == 'O')
- helper(board, i, 0);
- if(board【i】[length - 1] == 'O')
- helper(board, i, length - 1);
- }
- for(int i = 0; i < width; ++i)
- {
- for(int j = 0; j < length; ++j)
- {
- if(board【i】[j] == 'O')
- board【i】[j] = 'X';
- else if(board【i】[j] == 'B')
- board【i】[j] = 'O';
- }
- }
- }
- }
复制代码
|
|