Fork me on GitHub

130. Surrounded Regions

130. Surrounded Regions

题目

 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.

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'遍历之后暂存为''。非''的'O'即被'X'包围了。

  • 此题考查DFS/BFS的思想,就像走迷宫问题,入口和出口位置不同,DFS/BFS的效率不一样,递归式的DFS 会出现stackoverflow 或者run time的问题

  • bug :发现leetcode系统必须检查输入为空的情况!否则出现"Runtime Error Message:reference binding to null pointer of type 'struct value_type' Last executed input: [] 之类的错误!!!

class Solution {
public:
    void bfs(vector<vector<char>> &board,int cur_i,int cur_j,int row,int col)
    {
        if(board[cur_i][cur_j]!='O')
            return;
        board[cur_i][cur_j]='*';
        queue<pair<int, int >> q;
        q.push(make_pair(cur_i,cur_j));
        
        while(!q.empty())
        {
            int i=q.front().first;
            int j=q.front().second;
            q.pop();
            //board[i][j]='*';
            if(i-1>=0&&board[i-1][j]=='O')
            {
                board[i-1][j]='*';
                q.push(make_pair(i-1,j));
            }
            if(i+1<row&& board[i+1][j]=='O')  //i+1<=row bug:vector边界溢出,花了很长时间才找到!!!
            {
                board[i+1][j]='*';
                q.push(make_pair(i+1,j));
            }
            if(j-1>=0&&board[i][j-1]=='O')
            {
                board[i][j-1]='*';
                q.push(make_pair(i,j-1));                
            }
            if(j+1<col&&board[i][j+1]=='O') //j+1<=col
            {
                board[i][j+1]='*';
                q.push(make_pair(i,j+1));
            }
        }
    }
    
    void solve(vector<vector<char>> &board) {
        
        //bfs
        if (board.empty())  //bug :发现leetcode系统必须检查输入为空的情况!
	      return;
        int row=board.size();
        int col=board[0].size();
        if(row==0||col==0)
            return;
 
        for(int i=0;i<row;i++)
        {
            if(board[i][0]=='O')
                bfs(board,i,0,row,col);
            if(board[i][col-1]=='O')
                bfs(board,i,col-1,row,col);
        }
        for(int j=0;j<col;j++)
        {
            if(board[0][j]=='O')
                bfs(board,0,j,row,col);
            if(board[row-1][j]=='O')
                bfs(board,row-1,j,row,col);
        }
        
        for(int i=0;i<row;i++)
            for(int j=0;j<col;j++)
            {
                board[i][j]= (board[i][j]=='*')?'O':'X';
            }
        
    }
};

  • 这样考虑时间复杂度
       for(int i=0;i<row;i++)
            for(int j=0;j<col;j++) //直接也有复杂度的问题
            {
                if(board[i][j]=='O')
                {
                 if(i==0||i==row-1||j==0||j==col-1)
                    {
                        bfs(board,i,j,row,col); //广度优先搜索使用队列
                    }
                }
            }

题目来源

posted @ 2017-12-30 15:08  ranjiewen  阅读(393)  评论(0编辑  收藏  举报