130 Surrounded Regions

题目链接: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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

解题思路: 
这题可以看做是图的广度遍历。虽然图的深度遍历也可以做,但是对本题而言,会超时。矩阵过大时,递归栈会变得很深。 
思路是: 
从矩形最外面一圈开始逐渐向里拓展。 
若 O 是在矩形最外圈,它肯定不会被 X 包围,与它相连(邻)的 O 也就不可能被 X 包围,也就不会被替换,所以我们的工作主要是找出: 
1. 最外圈的 O 
2. 与最外圈的 O 相连的 O 
3. 将上述找到的元素替换为某种标识符,代码中使用“#” 
4. 最后按先行后列的顺序遍历矩形,找到没有被替换为 O 的元素,它们就是被 X 完全包围的需要被替换为 X 的元素;同时,标记为 # 的元素是没有被 X 包围的元素,此时将它们变回原来的 O

上述思路参考了大神的解法。 
大神参考链接:http://blog.csdn.net/linhuanmars/article/details/22904855

代码实现:

class Solution {
public:
    int go[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    void solve(vector<vector<char>>& board) {
        //board.clear();
        //board[0]={'O','O','O'};
       // board[1]={'O','O','O'};
        //board[2]={'O','O','O'};
        if(board.empty()) return ;
        int go[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
        for(int i=0;i<=board.size()-1;i++)
        {
            bfs(board,i,0);
            bfs(board,i,board[0].size()-1);
        }
        for(int j=0;j<=board[0].size()-1;j++)
        {
            bfs(board,0,j);
            bfs(board,board.size()-1,j);
        }
        for(int i=0;i<=board.size()-1;i++)
        {
            for(int j=0;j<=board[0].size()-1;j++)
            {
                if(board[i][j]=='#')
                    board[i][j]='O';
                else if(board[i][j]=='O')
                    board[i][j]='X';
            }
        }
        return ;
    }
    void bfs(vector<vector<char>>& board,int i,int j)
    {
        if(board[i][j]!='O') return ;
        board[i][j]='#';
        queue<int> tmp;
        tmp.push(i*board[0].size()+j);
        while(!tmp.empty())
        {
            int x=tmp.front()/board[0].size();
            int y=tmp.front()%board[0].size();
            tmp.pop();
            for(int i=0;i<=3;i++)
            {
                int xgo=x+go[i][0];
                int ygo=y+go[i][1];
                //if(xgo==1&&ygo==1)   printf("111");
                if(xgo>=0&&xgo<board.size()&&ygo>=0&&ygo<board[0].size()&&board[xgo][ygo]=='O')
                {
                    //if(xgo==1&&ygo==1)   printf("111");
                    board[xgo][ygo]='#';
                    tmp.push(xgo*board[0].size()+ygo);
                        
                }
            }
                
        }
    }
};

猜你喜欢

转载自blog.csdn.net/momo_mo520/article/details/80545924