Surrounded Regions问题及解法

来源:互联网 发布:美食纪录片 知乎 编辑:程序博客网 时间:2024/05/18 17:02

问题描述:

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.

示例,

X X X XX O O XX X O XX O X X

After running your function, the board should be:

X X X XX X X XX X X XX O X X

问题分析:

根据题意,凡事矩阵中的‘O’能找到一条全‘O’的路径,最后一个节点在矩阵的边上,那么这些‘O’元素就不必变成‘X’元素。

首先,我们把边上的’O‘设置为’1‘;其次,遍历每一个元素,若此时元素值为’1‘,则依此展开深度优先遍历,找到与该元素在相邻且值为’O‘的元素,将这些元素值置为’1‘。

最后,我们把为’1‘的元素置为’O‘,为’O‘的元素置为’X‘。


过程详见代码:

class Solution {public:void solve(vector<vector<char>>& board) {int m = board.size();if (!m) return;int n = board[0].size();for (int j = 0; j < n; j++){if (board[0][j] == 'O') board[0][j] = '1';if (board[m - 1][j] == 'O')  board[m - 1][j] = '1';}for (int i = 0; i < m; i++){if (board[i][0] == 'O')  board[i][0] = '1';if (board[i][n - 1] == 'O')  board[i][n-1] = '1';}for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){if (board[i][j] == '1'){bl(board, i, j, m, n);}}}for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){if (board[i][j] == '1'){board[i][j] = 'O';}else if (board[i][j] == 'O'){board[i][j] = 'X';}}}}void bl(vector<vector<char>>& board,int i,int j,int m,int n){if (i + 1 < m && board[i+1][j]=='O'){board[i + 1][j] = '1';bl(board, i + 1, j, m, n);}if (i - 1 >= 0 && board[i - 1][j] == 'O'){board[i - 1][j] = '1';bl(board, i - 1, j, m, n);}if (j - 1 >= 0 && board[i][j - 1] == 'O'){board[i][j - 1] = '1';bl(board, i, j -1, m, n);}if (j + 1 < n && board[i][j + 1] == 'O'){board[i][j + 1] = '1';bl(board, i, j + 1, m, n);}}};




原创粉丝点击