zoukankan      html  css  js  c++  java
  • Java for LeetCode 130 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
    解题思路:

    对最外面一圈进行BFS,替换掉最外圈的连通范围,剩下的‘O’都是被包围的,就可以直接kill掉,JAVA实现如下:

    	static public void solve(char[][] board) {
    		if (board.length <= 2 || board[0].length <= 2)
    			return;
    		for (int row = 0; row < board.length; row++) {
    			if (board[row][0] == 'O') {
    				board[row][0] = 'T';
    				bfs(board, row * board[0].length);
    			}
    			if (board[row][board[0].length - 1] == 'O') {
    				board[row][board[0].length - 1] = 'T';
    				bfs(board, row * board[0].length + board[0].length - 1);
    			}
    		}
    		for (int col = 1; col < board[0].length - 1; col++) {
    			if (board[0][col] == 'O') {
    				board[0][col] = 'T';
    				bfs(board, col);
    			}
    			if (board[board.length - 1][col] == 'O') {
    				board[board.length - 1][col] = 'T';
    				bfs(board, (board.length - 1) * board[0].length + col);
    			}
    		}
    		for (int row = 0; row < board.length; row++)
    			for (int col = 0; col < board[0].length; col++) {
    				if (board[row][col] == 'T')
    					board[row][col] = 'O';
    				else if (board[row][col] == 'O')
    					board[row][col] = 'X';
    			}
    
    	}
    
    	static public void bfs(char[][] board, int num) {
    		Queue<Integer> queue = new LinkedList<Integer>();
    		queue.add(num);
    		while (!queue.isEmpty()) {
    			num=queue.poll();
    			int row = num / board[0].length;
    			int col = num - row * board[0].length;
    			if (row - 1 >= 0 && board[row - 1][col] == 'O') {
    				board[row - 1][col] = 'T';
    				queue.add(num - board[0].length);
    			}
    			if (row + 1 <= board.length - 1 && board[row + 1][col] == 'O') {
    				board[row + 1][col] = 'T';
    				queue.add(num + board[0].length);
    			}
    			if (col - 1 >= 0 && board[row][col - 1] == 'O') {
    				board[row][col - 1] = 'T';
    				queue.add(num - 1);
    			}
    			if (col + 1 <= board[0].length - 1 && board[row][col + 1] == 'O') {
    				board[row][col + 1] = 'T';
    				queue.add(num + 1);
    			}
    		}
    	}
    
  • 相关阅读:
    力扣第945题 使数组唯一的最小增量
    力扣第365题 水壶问题
    力扣面试题40 最小的k个数
    力扣第409题 最长回文串
    力扣第46题 全排列
    力扣第1160题 拼写单词
    力扣面试题01.06 字符串压缩
    力扣第695题 岛屿的最大面积
    树莓派 鼠标自动消失
    树莓派 VNC 远程桌面 同一个桌面
  • 原文地址:https://www.cnblogs.com/tonyluis/p/4544441.html
Copyright © 2011-2022 走看看