Leetcode130. 被围绕的区域(深搜)

问题描述

给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。
找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。

示例

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

运行你的函数后,矩阵变为:

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

解释:
被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

代码

class Solution {
    void def(int i,int j,int[][]res1,char[][]board) {
		if(i-1>0&&board[i-1][j]=='O'&&res1[i-1][j]==0)
				{
				res1[i-1][j]=1;
				def(i-1,j,res1,board);
				}
			if(i+1<board.length&&board[i+1][j]=='O'&&res1[i+1][j]==0)
				{
				res1[i+1][j]=1;
				def(i+1,j,res1,board);
				}
			if(j-1>0&&board[i][j-1]=='O'&&res1[i][j-1]==0)
				{
				res1[i][j-1]=1;
				def(i,j-1,res1,board);
				}
			if(j+1<board[0].length&&board[i][j+1]=='O'&&res1[i][j+1]==0)
				{
				res1[i][j+1]=1;
				def(i,j+1,res1,board);
				}
	}
	 public void solve(char[][] board) {
		 if(board==null||board.length==0||board[0].length==0)
			 return;
		 	int[][] res1=new int[board.length][board[0].length];
		 	int[][] res2=new int[board.length][board[0].length];
		 	for(int i=0;i<board.length;i++) {
		 		int j=0;
		 			if(board[i][j]=='O') {
		 				res1[i][j]=1;
		 				def(i,j,res1,board);
		 			}
		 		j=board[0].length-1;
		 			if(board[i][j]=='O') {
		 				res1[i][j]=1;
		 				def(i,j,res1,board);
		 			}
		 	}
		 	for(int j=0;j<board[0].length;j++) {
		 		int i=0;
		 			if(board[i][j]=='O') {
		 				res1[i][j]=1;
		 				def(i,j,res1,board);
		 			}
		 		i=board.length-1;
		 			if(board[i][j]=='O') {
		 				res1[i][j]=1;
		 				def(i,j,res1,board);
		 			}
		 	}
		 	for(int i=0;i<board.length;i++) {
		 		for(int j=0;j<board[0].length;j++) {
		 			if(board[i][j]=='O'&&res1[i][j]==0) {
		 				board[i][j]='X';
		 			}
		 		}
		 	}
	    }
}

原文地址:https://www.cnblogs.com/code-fun/p/14303016.html