[leetcode] Surrounded Regions

来源:互联网 发布:类似onedrive的软件 编辑:程序博客网 时间:2024/05/17 03:33

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 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
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;}}


0 0