LeetCode Surrounded Regions

本文介绍了一个经典的LeetCode题目——围绕区域问题的解决方案。该问题要求在二维棋盘中,将被 'X' 包围的所有 'O' 翻转为 'X'。文章详细介绍了使用广度优先搜索(BFS)算法解决该问题的方法,并通过一个具体的示例展示了算法的工作过程。

https://oj.leetcode.com/problems/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




这是一个搜索问题,这个题本身不难,但是我第一次做的时候没有AC,主要是我第一次用的是递归操作,然后栈溢出了,最后我用一个数组来模拟一个队列,将递归转化为类迭代的方式。


public class Solution {

	public void bfs(char [][]board,int [][]matrix,int u,int v,int count){
		
		int n = board.length;
		int m = board[0].length;
		
		ArrayList<Point>arrayList = new ArrayList<Point>();
		Point point = new Point();
		point.x = u;
		point.y = v;
		arrayList.add(point);
		while(!arrayList.isEmpty()){
			
			point = arrayList.remove(0);
			
			if(point.x+1<n&&board[point.x+1][point.y]=='O'&&matrix[point.x+1][point.y]==0){
				matrix[point.x+1][point.y] = count;
				Point point2 = new Point();
				point2.x = point.x+1;
				point2.y = point.y;
				arrayList.add(point2);
			}
			
			if(point.x-1>=0&&board[point.x-1][point.y]=='O'&&matrix[point.x-1][point.y]==0){
				matrix[point.x-1][point.y] = count;
				Point point2 = new Point();
				point2.x = point.x-1;
				point2.y = point.y;
				arrayList.add(point2);
			}
			
			if(point.y+1<m&&board[point.x][point.y+1]=='O'&&matrix[point.x][point.y+1]==0){
				matrix[point.x][point.y+1] = count;
				Point point2 = new Point();
				point2.x = point.x;
				point2.y = point.y+1;
				arrayList.add(point2);
				
			}
			
			if(point.y-1>=0&&board[point.x][point.y-1]=='O'&&matrix[point.x][point.y-1]==0){
				matrix[point.x][point.y-1] = count;
				Point point2 = new Point();
				point2.x = point.x;
				point2.y = point.y-1;
				arrayList.add(point2);
				
			}
			
		}
		
	}

	public void solve(char[][] board) {
		
		if(board==null)return;
		int n = board.length;
		if(n==0)return;
		int m = board[0].length;
		if(m==0)return;
		int [][]matrix = new int [n][m];
		
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				matrix[i][j]=0;
			}
		}
		int count=0;
		
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				if(board[i][j]=='O'&&matrix[i][j]==0){
					matrix[i][j]=++count;
					bfs(board, matrix, i, j, count);
					
				}
			}
			
		}
		
		
		
		boolean [] change = new boolean [count+1];
		
		for(int i=1;i<=count;i++){
			change[i] = true;
		}
		
		for(int i=0;i<m;i++){
			change[matrix[0][i]] = false;
			change[matrix[n-1][i]] = false;
		}
		
		for(int i=0;i<n;i++){
			change[matrix[i][0]] = false;
			change[matrix[i][m-1]] = false;
		}
		
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				
				if(change[matrix[i][j]]&&board[i][j]=='O'){
					board[i][j] = 'X';
				}
			}
		}
    }


}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值