您的位置:首页 > 其它

[leetcode] Surrounded Regions

2015-07-01 11:12 330 查看
From : https://leetcode.com/problems/surrounded-regions/
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

class Solution {
public:
void solve(vector<vector<char> >& board) {
if(!board.size() || !board[0].size()) return;
m=board.size(), n=board[0].size();
for(int i=0; i<m; i++) {
if(board[i][0]=='O') search(board, i ,0);
if(board[i][n-1]=='O') search(board, i ,n-1);
}
for(int i=0; i<n; i++) {
if(board[0][i]=='O') search(board, 0, i);
if(board[m-1][i]=='O') search(board, m-1, i);
}
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(board[i][j]=='O') board[i][j]='X';
else if(board[i][j]=='P') board[i][j]='O';
}
}
}
void search(vector<vector<char> >& board, int i, int j) {
queue<point> q;
q.push(point(i, j));
board[i][j] = 'P';
while(!q.empty()) {
point p = q.front(); q.pop();
i = p.x;
j = p.y;
if(i-1>=0 && board[i-1][j]=='O') {
q.push(point(i-1, j));
board[i-1][j] = 'P';
}
if(i+1< m && board[i+1][j]=='O') {
q.push(point(i+1, j));
board[i+1][j] = 'P';
}
if(j-1>=0 && board[i][j-1]=='O') {
q.push(point(i, j-1));
board[i][j-1] = 'P';
}
if(j+1< n && board[i][j+1]=='O') {
q.push(point(i, j+1));
board[i][j+1] = 'P';
}
}
}
private:
struct point{
int x;
int y;
point(int i, int j):x(i),y(j) {}
};
int n, m;
};
这道题应该注意,在入队的时候,将board更新,而不是出队的时候更新。

public class Solution {
private static class Point {
int X;
int Y;

public Point(int x, int y) {
X = x;
Y = y;
}
}

private int m, n;
private int[] X = { 1, 0, -1, 0 };
private int[] Y = { 0, 1, 0, -1 };

public void solve(char[][] board) {
if (board == null || board.length == 0) {
return;
}
m = board.length;
n = board[0].length;
for(int i=0; i<m; ++i) {
if(board[i][0] == 'O') {
set(board, i, 0);
}
if(board[i][n-1] =='O') {
set(board, i, n-1);
}
}
for(int j=0; j<n;++j) {
if(board[0][j] == 'O') {
set(board, 0, j);
}
if(board[m-1][j] == 'O') {
set(board, m-1, j);
}
}
for(int i=0; i<m; ++i) {
for(int j=0; j<n; ++j) {
if(board[i][j] == '-') {
board[i][j] = 'O';
} else if(board[i][j] == 'O') {
board[i][j] = 'X';
}
}
}
}

private void set(char[][] board, int i, int j) {
Queue<Point> q = new LinkedList<Point>();
board[i][j] = '-';
q.add(new Point(i, j));
while (!q.isEmpty()) {
Point p = q.poll();
int a = p.X;
int b = p.Y;
for (int k = 0; k < 4; ++k) {
int x = a + X[k];
int y = b + Y[k];
if (valid(x, y) && board[x][y] == 'O') {
board[x][y] = '-';
q.add(new Point(x, y));
}
}
}
}

private boolean valid(int x, int y) {
return x >= 0 && x < m && y >= 0 && y < n;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: