Surrounded Regions

原创 2015年11月18日 18:03:34

题目: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

思路:

一共是两种思路,不过本质都是一样,均是反其道而行,不进行正向的把里面的O改变成X,而是先把最外围的O变成另外一个符号,最后把其他符号均变成X,而把刚刚的那个改成O。

接下来就是BFS还是DFS了。

DFS写在代码里面,但是会出现栈溢出。

BFS似乎不会,我不知道为啥,只是能够成功。

具体的概念就是一旦在四周遇到O,那么存入堆栈,再插入周围的四个方向的。但是要在堆栈循环里面判断i和j是否满足数组范围条件啥的以及本身是否是O。

程序最后就是把其他的负号全部变成X,我所改变的那个负号变成O。即可。

代码:

class Solution {
public:
/*
    void solve(vector<vector<char>>& board) {
        if(board.empty()||board[0].empty()) return;
        int i=0,j=0;
        int m=board.size(),n=board[0].size();
        
        for(;j<n-1;j++){ 
            walk(board,i,j);
        }
        
        for(;i<m-1;i++){        //right
            walk(board,i,j);
        }
        
        for(;j>0;j--){          //down
            walk(board,i,j);
        }
        
        for(;i>0;i--){//left
            walk(board,i,j);
        }
        
        for(i=0;i<m;i++){
            for(j=0;j<n;j++){
                if(board[i][j]=='#') board[i][j]='O';
                else    board[i][j]='X';
            }
        }
    }
    
    void walk(vector<vector<char> >&board,int i,int j){
        //DFS
        if(i<0||i>=board.size()||j<0||j>=board[0].size())   return;
        if(board[i][j]=='O'){
            board[i][j]='#';
            walk(board,i-1,j);
            walk(board,i+1,j);
            walk(board,i,j-1);
            walk(board,i,j+1);
        }
    }*/
    
        void bfs(int i, int j, vector<vector<char>>& board) {
        int n = board.size();
        int m = board[0].size();
        queue<pair<int, int>> q;
        q.push(make_pair(i, j));
        while (!q.empty()) {
            auto top = q.front();
            q.pop();
            if (top.first >= 0 && top.first < n && top.second >= 0 && top.second < m && board[top.first][top.second] == 'O') {
                //如果没有这句话,那么你接下来的make_pair就会出错,溢出.
                board[top.first][top.second] = '#';
                q.push(make_pair(top.first - 1, top.second));
                q.push(make_pair(top.first + 1, top.second));
                q.push(make_pair(top.first, top.second + 1));
                q.push(make_pair(top.first, top.second - 1));
            }
        }
    }

    void solve(vector<vector<char>>& board) {
        if(board.empty()||board[0].empty()) return;
        int m=board.size(),n=board[0].size();
        
        for(int i=0;i<m;i++){
            //最左边与最右边
            if(board[i][0]=='O')    walk( board,i,0);
            if(board[i][n-1]=='O')  walk( board,i,n-1);
        }
        
        for(int i=1;i<n-1;i++){
            //最上边与最下边
            if(board[0][i]=='O')    walk( board,0,i);
            if(board[m-1][i]=='O')  walk( board,m-1,i);
        }
        
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(board[i][j]=='#')    board[i][j]='O';
                else    board[i][j]='X';
            }
        }
    }
    
    void walk(vector<vector<char>>& board,int i,int j){
        int m=board.size(),n=board[0].size();
        queue<pair<int,int>>q;
        q.push(make_pair(i,j));
        while(!q.empty()){
            auto tem=q.front();
            q.pop();
            if(tem.first>=0&&tem.first<m&&tem.second>=0&&tem.second<=n&&board[tem.first][tem.second]=='O'){
                board[tem.first][tem.second]='#';
                q.push(make_pair(tem.first-1,tem.second));
                q.push(make_pair(tem.first+1,tem.second));
                q.push(make_pair(tem.first,tem.second-1));
                q.push(make_pair(tem.first,tem.second+1));
            }
        }
    }
};


版权声明:本文为博主原创文章,未经博主允许不得转载。

Leetcode Surrounded Regions 解题报告

http://oj.leetcode.com/problems/surrounded-regions/ Given a 2D board containing 'X' and 'O', captur...
  • worldwindjp
  • worldwindjp
  • 2014年02月15日 20:57
  • 4588

[leetcode-130]Surrounded Regions(java)

问题描述: Given a 2D board containing ‘X’ and ‘O’, capture all regions surrounded by ‘X’.A region is ca...
  • zdavb
  • zdavb
  • 2015年08月12日 20:39
  • 883

130 Surrounded Regions

题目链接:https://leetcode.com/problems/surrounded-regions/题目:Given a 2D board containing 'X' and 'O', ca...
  • ChilseaSai
  • ChilseaSai
  • 2015年12月21日 22:43
  • 1003

Surrounded Regions -- LeetCode

原题链接: http://oj.leetcode.com/problems/surrounded-regions/  这个题目用到的方法是图形学中的一个常用方法:Flood fill算法,其实就...
  • linhuanmars
  • linhuanmars
  • 2014年04月04日 01:12
  • 15004

(LeetCode 130)Surrounded Regions(并查集)

Q: Given a 2D board containing ‘X’ and ‘O’, capture all regions surrounded by ‘X’.A region is captu...
  • u014616233
  • u014616233
  • 2016年04月20日 22:07
  • 1693

LeetCode(130) Surrounded Regions

题目 Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by ...
  • fly_yr
  • fly_yr
  • 2016年08月15日 22:04
  • 1048

(LeetCode 130) Surrounded Regions(BFS)

Q: Given a 2D board containing ‘X’ and ‘O’, capture all regions surrounded by ‘X’.A region is captu...
  • u014616233
  • u014616233
  • 2016年04月20日 16:45
  • 713

LeetCode_Surrounded Regions

130. Surrounded Regions一、题目描述题目输入一个X O的矩阵,输出要求被 X 包围的 O 都变成 X。二、解题思路这里说下我的思路,看到这道题我先意识到的是边上的 O 都是不变的...
  • glDemo
  • glDemo
  • 2015年08月22日 04:57
  • 952

[leetcode] 130. Surrounded Regions 解题报告

题目链接:https://leetcode.com/problems/surrounded-regions/ Given a 2D board containing 'X' and 'O', c...
  • qq508618087
  • qq508618087
  • 2016年01月30日 16:17
  • 907

leetcode_question_130 Surrounded Regions

Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captur...
  • doc_sgl
  • doc_sgl
  • 2013年09月19日 23:54
  • 5119
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Surrounded Regions
举报原因:
原因补充:

(最多只允许输入30个字)