【leetcode】130.(Medium)Surrounded Regions

解题思路:
从board最边缘一圈开始向内使用DFS,将可以连通外圈的O设为'#',最后将所有的'#'转化为'O',将其他的'O'转化为'X'。

提交代码:

class Solution{
	public void solve(char[][] board) {
		if(board.length==0||board.length==1||board.length==2)	return;
		
		int m=board.length;
		int n=board[0].length;
		
		// DFS up
		for(int i=0;i<n;i++) {
			if(board[0][i]=='O') {
				board[0][i]='#';
				DFS(0,i,board);
			}
		}
		// right
		for(int j=1;j<m;j++) {
			if(board[j][n-1]=='O') {
				board[j][n-1]='#';
				DFS(j,n-1,board);
			}
		}
		//bottom
		for(int i=0;i<n-1;i++) {
			if(board[m-1][i]=='O') {
				board[m-1][i]='#';
				DFS(m-1,i,board);
			}
		}
		//left
		for(int j=1;j<m-1;j++) {
			if(board[j][0]=='O') {
				board[j][0]='#';
				DFS(j,0,board);
			}
		}
		
		for(int i=0;i<m;i++) {
			for(int j=0;j<n;j++) {
				if(board[i][j]=='X')	continue;
				if(board[i][j]=='#') 
					board[i][j]='O';
				else
					board[i][j]='X';
			}
		}
		
	}		
	
	private void DFS(int x,int y,char[][] board) {
		if(x-1>=0) {
			if(board[x-1][y]=='O') {
				board[x-1][y]='#';
				DFS(x-1,y,board);
			}
		}
		if(x+1<board.length) {
			if(board[x+1][y]=='O') {
				board[x+1][y]='#';
				DFS(x+1,y,board);
			}
		}
		if(y-1>=0) {
			if(board[x][y-1]=='O') {
				board[x][y-1]='#';
				DFS(x,y-1,board);
			}
		}
		if(y+1<board[0].length) {
				if(board[x][y+1]=='O') {
					board[x][y+1]='#';
					DFS(x,y+1,board);
				}
			}
		}
	}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/AXIMI/article/details/85687653