LeetCode 被围绕的区域

给定一个二维的矩阵,包含 ‘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'。
	如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

思路分析:可能大家碰到这道题都是想破脑袋想将中间被包围的‘O’区域找出来,但是这是几乎不可能的,因为中间可能根本就不存在被包围的区域,且即使是有包围的区域也找不出来。所以采取逆向思维,先将与上、下、左、右四个边界相邻的所有‘O’修改为‘T’,然后剩下的‘O’就是被包围的,将剩下的‘O’修改为‘X’,最后将‘T’修改回‘O’即可。

class Solution {
public:
	int rowSize, colSize;
	void solve(vector<vector<char>>& board) {
		int rowSize = board.size();
		if (rowSize == 0) {
			return;
		}
		int colSize = board[0].size();
		if (colSize == 0) {
			return;
		}
		//将外围的所有'O'全部修改为'T'
		for (int row = 0; row < rowSize; ++row) {
			if (board[row][0] == 'O') {//左边界
				board[row][0] = 'T';
				dfs(board, row, 0, 'O', 'T');
			}
			if (board[row][colSize - 1] == 'O') {//右边界
				board[row][colSize - 1] = 'T';
				dfs(board, row, colSize - 1, 'O', 'T');
			}
		}
		for (int col = 0; col < colSize; ++col) {
			if (board[0][col] == 'O') {//上边界
				board[0][col] = 'T';
				dfs(board, 0, col, 'O', 'T');
			}
			if (board[rowSize - 1][col] == 'O') {//下边界
				board[rowSize - 1][col] = 'T';
				dfs(board, rowSize - 1, col, 'O', 'T');
			}
		}
		//将中间剩余的'O'全部转换为'X'
		for (int row = 1; row < rowSize - 1; ++row) {
			for (int col = 1; col < colSize - 1; ++col) {
				if (board[row][col] == 'O') {
					board[row][col] = 'X';
				}
			}
		}
		//将外围的所有'T'全部修改为'O'
		for (int row = 0; row < rowSize; ++row) {
			if (board[row][0] == 'T') {//左边界
				board[row][0] = 'O';
				dfs(board, row, 0, 'T', 'O');
			}
			if (board[row][colSize - 1] == 'T') {//右边界
				board[row][colSize - 1] = 'O';
				dfs(board, row, colSize - 1, 'T', 'O');
			}
		}
		for (int col = 0; col < colSize; ++col) {
			if (board[0][col] == 'T') {//上边界
				board[0][col] = 'O';
				dfs(board, 0, col, 'T', 'O');
			}
			if (board[rowSize - 1][col] == 'T') {//下边界
				board[rowSize - 1][col] = 'O';
				dfs(board, rowSize - 1, col, 'T', 'O');
			}
		}
	}
	//将board[row][col]相邻且等于targetCh的修改为changeCh
	void dfs(vector<vector<char>>& board, int row, int col, char targetCh, char changeCh) {
		if (row - 1 >= 0 && board[row - 1][col] == targetCh) {//上方
			board[row - 1][col] = changeCh;
			dfs(board, row - 1, col, targetCh, changeCh);
		}
		if (row + 1 < board.size() && board[row + 1][col] == targetCh) {//下方
			board[row + 1][col] = changeCh;
			dfs(board, row + 1, col, targetCh, changeCh);
		}
		if (col - 1 >= 0 && board[row][col - 1] == targetCh) {//左方
			board[row][col - 1] = changeCh;
			dfs(board, row, col - 1, targetCh, changeCh);
		}
		if (col + 1 < board[0].size() && board[row][col + 1] == targetCh) {//右方
			board[row][col + 1] = changeCh;
			dfs(board, row, col + 1, targetCh, changeCh);
		}
	}
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/87884913