Surrounded Regions

题目描述:

Given a 2D board containing 'X' and 'O' (the letter 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'的连通区域并保存连通区域中每一个字符的位置,
然后遍历该连通区域的字符的位置,如果有字符位于输入2D board的边界上,
那么不对连通区域中的字符'O'进行处理,否则把连通区域中的所有字符'O'改为'X'。


AC代码如下:

class Solution {
public:
    void solve(vector<vector<char>>& board) {
        int m = board.size();
	if (m == 0) return;
	int n = board[0].size();
	vector<vector<bool>> visited(m, vector<bool>(n, false));
	vector<int> positions;
	for (int i = 0; i < m; ++i){
		for (int j = 0; j < n; ++j){
			if (board[i][j] == 'O'&&!visited[i][j]){
				int pos = i*n + j;
				positions.push_back(pos);
				visited[i][j] = true;
				int index = 0;
				while (!positions.empty()){
					int curPos = positions[index];
					int flag = 0;
					int row = curPos / n;
					int col = curPos % n;
					if (row - 1 >= 0 && board[row - 1][col] == 'O' && !visited[row - 1][col]){
						int tmpPos = (row - 1)*n + col;
						positions.push_back(tmpPos);
						visited[row - 1][col] = true;
						flag = 1;
					}
					if (row + 1 < m && board[row + 1][col] == 'O' && !visited[row + 1][col]){
						int tmpPos = (row + 1)*n + col;
						positions.push_back(tmpPos);
						visited[row + 1][col] = true;
						flag = 1;
					}
					if (col - 1 >= 0 && board[row][col - 1] == 'O' && !visited[row][col - 1]){
						int tmpPos = row*n + col - 1;
						positions.push_back(tmpPos);
						visited[row][col - 1] = true;
						flag = 1;
					}
					if (col + 1 < n && board[row][col + 1] == 'O' && !visited[row][col + 1]){
						int tmpPos = row*n + col + 1;
						positions.push_back(tmpPos);
						visited[row][col + 1] = true;
						flag = 1;
					}
					if (flag == 1 || index<positions.size()-1){
						++index;
					}
					else{
						int flag2 = 0;
						for (int k = 0; k < positions.size(); ++k){
							int tmpRow = positions[k] / n;
							int tmpCol = positions[k] % n;
							if (tmpRow == 0 || tmpRow == m - 1 || tmpCol == 0 || tmpCol == n - 1){
								flag2 = 1;
								break;
							}
						}
						for (int k = 0; k < positions.size(); ++k){
							int tmpRow = positions[k] / n;
							int tmpCol = positions[k] % n;
							if (flag2 == 0)
								board[tmpRow][tmpCol] = 'X';
						}
						positions.clear();
					}
				}
			}
		}
	}
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值