zoukankan      html  css  js  c++  java
  • leetcode--Surrounded Regions

    Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'.

    A region is captured by flipping all 'O's into 'X's in that surrounded region.

    For example,

    X X X X
    X O O X
    X X O X
    X O X X
    

    After running your function, the board should be:

    X X X X
    X X X X
    X X X X
    X O X X

    This is a simple problem, we just need to apply bfs on 'O' elements on the edges of board.
    public class Solution {
        public void solve(char[][] board) {
            int row = board.length;
    		if(row > 0){
    			int column = board[0].length;
    			Set<Integer> alreadyChecked = new HashSet<Integer>();
    			for(int i = 0; i < column; ++i){
    				if(board[0][i] == 'O' && !alreadyChecked.contains(i))
    					bfs(board,0, i, alreadyChecked);
    				if(board[row - 1][i] == 'O' && !alreadyChecked.contains((row - 1) * column + i))
    					bfs(board,row - 1, i, alreadyChecked);
    			}
    			for(int i = 1; i < row - 1; ++i){
    				if(board[i][0] == 'O' && !alreadyChecked.contains(i * column))
    					bfs(board,i, 0, alreadyChecked);
    				if(board[i][column - 1] == 'O' && !alreadyChecked.contains(i * column + column - 1))
    					bfs(board,i, column - 1, alreadyChecked);
    			}
    			
    			for(int i = 0; i < row; ++i){
    				for(int j = 0; j < column; ++j){
    					if(board[i][j] == 'O' && !alreadyChecked.contains(i*column + j))
    						board[i][j] = 'X';
    				}
    			}
    		}
        }
    	
    	private void bfs(char[][] board, int i, int j, Set<Integer> alreadyChecked) {
    		int row = board.length;
    		if(row > 0){
    			int column = board[0].length;
    			if(!alreadyChecked.contains(i * column + j)) {
    				Queue<Integer> current = new LinkedList<Integer>();
    				alreadyChecked.add(i * column + j);
    				current.add(i * column + j);
    				while(current.peek() != null){
    					int currentCoordinate = current.poll();
    					int x = currentCoordinate / column;
    					int y = currentCoordinate % column;
    					
    					if(x - 1 >= 0 && board[x - 1][y] == 'O' && !alreadyChecked.contains(currentCoordinate - column)){
    						current.add(currentCoordinate - column);
    						alreadyChecked.add(currentCoordinate - column);
    					}
    					
    					if(x + 1 < row && board[x + 1][y] == 'O' && !alreadyChecked.contains(currentCoordinate + column)){
    						current.add(currentCoordinate + column);
    						alreadyChecked.add(currentCoordinate + column);
    					}
    					
    					if(y - 1 >= 0 && board[x][y - 1] == 'O' && !alreadyChecked.contains(currentCoordinate - 1)) {
    						current.add(currentCoordinate - 1);
    						alreadyChecked.add(currentCoordinate - 1);
    					}
    					
    					if(y + 1 < column && board[x][y + 1] == 'O' && !alreadyChecked.contains(currentCoordinate + 1)) {
    						current.add(currentCoordinate + 1);
    						alreadyChecked.add(currentCoordinate + 1);
    					}
    				}
    			}
    		}    
        }
    }
    

      

  • 相关阅读:
    bzoj1015星球大战(并查集+离线)
    bzoj1085骑士精神(搜索)
    bzoj1051受欢迎的牛(Tarjan)
    左偏树学习
    hdu1512 Monkey King(并查集,左偏堆)
    左偏树(模板)
    PAT (Basic Level) Practice (中文) 1079 延迟的回文数 (20分) (大数加法)
    PAT (Basic Level) Practice (中文) 1078 字符串压缩与解压 (20分) (字符转数字——栈存放)
    PAT (Basic Level) Practice (中文) 1077 互评成绩计算 (20分) (四舍五入保留整数)
    PAT (Basic Level) Practice (中文) 1076 Wifi密码 (15分)
  • 原文地址:https://www.cnblogs.com/averillzheng/p/3825371.html
Copyright © 2011-2022 走看看