LeetCode(130) 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’連成的片區不會被改變爲‘X’,其餘位置的‘O’均會被改爲‘X’;所以依次從每行的左右邊界,每列的上下邊界出發,檢查元素,對於不能由‘O’改爲‘X’的位置標記爲'1';


代碼

class Solution {
public:
	void solve(vector<vector<char>>& board) {
		if (board.empty())
		{
			return;
		}

		int m = board.size(), n = board[0].size();
		/*核心思想,只有當邊界節點爲O*/
		for (int i = 0; i < m; ++i)
		{
			//檢查每行第一個元素
			check(board, i, 0, m, n);
			//若矩陣多列,則繼續檢查每行最後一個元素
			if (n > 1)
				check(board, i, n - 1, m, n);
		}

		for (int j = 1; j < n-1; ++j)
		{
			//檢查每列第一個元素
			check(board, 0, j, m, n);

			//若矩陣多行,繼續檢查每列最底元素
			if (m > 1)
				check(board, m - 1, j, m, n);
		}

		for (int i = 0; i < m; ++i)
		{
			for (int j = 0; j < n; ++j)
			{
				if (board[i][j] == 'O')
					board[i][j] = 'X';
			}//for
		}//for

		for (int i = 0; i < m; ++i)
		{
			for (int j = 0; j < n; ++j)
			{
				if (board[i][j] == '1')
					board[i][j] = 'O';
			}//for
		}//for
		
	}

	/*檢查(i,j)位置是否爲'o',若爲'o',標記爲'1' */
	void check(vector<vector<char>>& board,int i, int j, int row, int col)
	{
		if (i < 0 || i >= row || j < 0 || j >= col)
			return;

		if (board[i][j] == 'O')
		{
			board[i][j] = '1';
			if (i > 1)
				check(board, i - 1, j, row, col);
			
			if (i < row - 1)
				check(board, i + 1, j, row, col);

			if (j > 1)
				check(board, i, j - 1, row, col);

			if (j < col - 1)
				check(board, i, j + 1, row, col);
		}
	}
};

GitHub源碼



發佈了360 篇原創文章 · 獲贊 348 · 訪問量 112萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章