Surrounded Regions

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值