Surrounded Regions

来源:互联网 发布:知乎 网页版 编辑:程序博客网 时间:2024/05/01 19:32
pro:给一个图,图包含'X'和‘O’,将图中所有的被包围的'O'置为‘X’,被包围的意思是周围都是'X',没有到边界。
sol:有两个做法
做法1:从每一个没被访问过的'O'开始,bfs或dfs,记录下这次有没有通过某个‘O’到达了边界,有的话就是不能置为'X'的,没有的话就能
做法2:逆向思维,从矩阵的四边找,扩展所有能扩展的'O'.剩下的就是被包围的
此题网页1A,awesome!
code:
class Solution {public:    bool isOK(int x,int y,int n,int m,vector< vector<bool> > &used,vector< vector<char> > &board)    {        if(x>=0&&x<n&&y>=0&&y<m&&used[x][y]==false&&board[x][y]=='O')            return true;        else return false;    }    void bfs(vector< vector<bool> > &used,vector< vector<char> > &board,int x,int y)    {        int i,j,n,m;        n = board.size(),m=board[0].size();        queue<int> xque,yque;        while(!xque.empty())            xque.pop();        while(!yque.empty())            yque.pop();        xque.push(x),yque.push(y);        used[x][y]=true;        int dir[4][2]={0,1,0,-1,1,0,-1,0};        int frontx,fronty,tempx,tempy,t;        while(!xque.empty())        {            frontx = xque.front();            fronty = yque.front();            xque.pop(),yque.pop();            for(t=0;t<4;t++)            {                tempx = frontx+dir[t][0];                tempy = fronty+dir[t][1];                if(isOK(tempx,tempy,n,m,used,board))                {                    used[tempx][tempy] = true;                    xque.push(tempx),yque.push(tempy);                }            }        }    }    void solve(vector<vector<char>> &board) {        int i,j,n,m;        n = board.size();        if(n==0) return;        m = board[0].size();        if(m==0) return;        vector< vector<bool> > used(n,vector<bool>(m,false));        for(i=0;i<n;i++)        {            if(board[i][0]=='O'&&used[i][0]==false)                bfs(used,board,i,0);            if(board[i][m-1]=='O'&&used[i][m-1]==false)                bfs(used,board,i,m-1);        }        for(i=0;i<m;i++)        {            if(board[0][i]=='O'&&used[0][i]==false)                bfs(used,board,0,i);            if(board[n-1][i]=='O'&&used[n-1][i]==false)                bfs(used,board,n-1,i);        }        for(i=0;i<n;i++)        {            for(j=0;j<m;j++)            {                if(board[i][j]=='O'&&used[i][j]==false)                    board[i][j]='X';            }        }    }};


0 0
原创粉丝点击