LeetCode: surrounded-regions

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuweiyuxiang/article/details/87933326

题目:

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

思路:

找那些在边界上的O,这些O一定不能转换为X,而且与这些O相连的在内部的O也不能转换为x
步骤:
1.暂时修改那些在边界且与边界相连(深搜找这些点)的点值为*
2.接着修改剩余的值为O的点为X,这些就是surrounded by x的点了
3.接着将值为*的点复原为O
代码:

class Solution {
public:
	void solve(vector<vector<char>> &board) {
		if (board.size() < 3 || board[0].size() < 3){
			return;
		}

		int row_num = board.size();
		int col_num = board[0].size();
		for (int i = 0; i < col_num; i++){
			dfs(board, 0, i); //上边界
			dfs(board, row_num - 1, i); //下边界
		}
		for (int i = 0; i < row_num; i++){
			dfs(board, i, 0); //左边界
			dfs(board, i, col_num - 1); //右边界
		}
		for (int i = 0; i < row_num; i++){
			for (int j = 0; j < col_num; j++){
				if (board[i][j] == 'O'){
					board[i][j] = 'X';
				}
				if (board[i][j] == '*'){
					board[i][j] = 'O';
				}
			}
		}
	}
	void dfs(vector<vector<char>> &board, int i, int j){
		int row_num = board.size();
		int col_num = board[0].size();
		if (i < 0 || i >= row_num || j < 0 || j >= col_num)
			return;
		if (board[i][j] != 'O')
			return;
		board[i][j] = '*';
		dfs(board, i, j - 1);
		dfs(board, i - 1, j);
		dfs(board, i, j + 1);
		dfs(board, i + 1, j);
	}
};

猜你喜欢

转载自blog.csdn.net/liuweiyuxiang/article/details/87933326