包围区域

23、包围区域
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
题设要求:给定包含’X’和’O’的二维区域,捕获被’X’包围的所有区域。通过将所有’O’翻转到该包围区域中的’X’来捕获区域。
分析:其实是一道深度优先搜索的问题。首先我们很容易发现,被‘X’包围的‘O’,一定不会是边缘的‘O’。进一步地,我们不难意识到,如果有和边缘的‘O’相连的内部‘O’,也就一定不可能被‘X’包围。反过来,我们可以先找到处于边缘的‘O’以及所有和边缘’O’相连接的’O’。然后将这些找到的目标‘O’标记为‘*’。那么剩下来的‘O’就是被‘X’包围的了,将它们改为‘X’。最后,将标记为‘*’的点再复原为‘O’。

代码如下:

import java.util.LinkedList;
import java.util.Queue;
public class Solution {
//mian省略,调试时可自行添加
   public void solve(char[][] board) {
	        if(board.length == 0 ) return;
	        int row = board.length;
	        int col = board[0].length;
	        //行搜索
	        for (int i = 0; i < row; i++) {
	            if (board[i][0] == 'O') search(board,i,0);
	            if (board[i][col-1] == 'O') search(board,i,col-1);
	        }
	        //列搜索
	        for (int i = 0; i < col; i++) {
	            if (board[0][i] == 'O') search(board,0,i);
	            if (board[row-1][i] == 'O') search(board,row-1,i); 
	        }
	        
	        for (int i = 0; i < row; i++)
	            for (int j = 0; j < col; j++) {
	                if (board[i][j] == 'O') board[i][j] = 'X';
	                else if (board[i][j] == '*') board[i][j] = 'O';
	            }
	 
	    }
	    //核心代码
	    public static void search( char[][] board , int x, int y ){
	 
	        int[][] arrays = {{0,1},{0,-1},{1,0},{-1,0}};
	        Queue<Integer[]> queue = new LinkedList<>();
	        Integer[] integers = {x,y};
	        queue.offer(integers);
	        board[x][y] = '*';
	 
	        while ( queue != null && queue.size() != 0){
	            Integer[] temp = queue.poll();
	            for (int i = 0; i < 4; i++) {
	                Integer newX = temp[0]+arrays[i][0];
	                Integer newY = temp[1]+arrays[i][1];
	                if (newX < 0 || newX >= board.length || newY < 0 || newY >= board[0].length) continue;
	 
	                if (board[newX][newY] == 'O'){
	                    board[newX][newY] = '*';
	                    Integer[] t = {newX, newY};
	                    queue.offer(t);
	                }
	            }
	        }
	 
	    }



}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值