【leetcode】Surrounded Regions

本文介绍了一种解决二维棋盘中被'X'包围的所有'O'区域捕获问题的算法实现。通过使用广度优先搜索(BFS)和深度优先搜索(DFS)两种方法,文章详细探讨了如何将所有被'X'包围的'O'翻转成'X',同时保留边缘接触的'O'不变。该解决方案适用于LeetCode上的相关题目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

Solve the problem on leetcode


class Solution {
public:
     queue<int>  q;
    void solve(vector<vector<char>>& board) {
        if(board.empty()) return;
        int row=board.size();
        int col=board[0].size();
        
        //四周的数
        for(int j=0;j<col;j++)
        {
            bfs(board,0,j);//第一行
            bfs(board,row-1,j);//最后一行
        }
        for(int i=1;i<row-1;i++ )
        //??????
        //去除交集
        {
            bfs(board,i,0);//第一列
            bfs(board,i,col-1);//最后一列
            
        }
        for(int i=0;i<row;i++)//最后还原
         for(int j=0;i<col;j++)//O转为x,D转为O
         {
             if(board[i][j]=='D')
             board[i][j]='O';
             else if(board[i][j]=='O')
             board[i][j]='X';
         }
        
    }
    
   /* void dfs(vector<vector<char> >&board,int x,int y)
    {
        if(x<0||x>board.size()-1||y<0||y>board[0].size()-1||board[x][y]!='O')
        return ;
        board[x][y]='D';
        
        dfs(board,x-1,y);//left
        dfs(board,x+1,y);//right
        dfs(board,x,y-1);//down
        dfs(board,x,y+1);//up
    }*/
    
    void bfs(vector<vector<char>> &board,int x,int y)
    {
        //方向信息
        int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
        int row=board.size();
        int col=board[0].size();
        if(board[x][y]=='O') q.push(x*col+y);
        while(!q.empty())
        {
            int tmp=q.front();
             x=tmp/col;
             y=tmp%col;
             board[x][y]='D';
             for(int i=0;i<4;i++)
             {
                 int a=x+dir[i][0];
                 int b=y+dir[i][1];
                 if(a>=0&&a<row&&b>=0&&b<col&&board[a][b]=='O')
                 q.push(a*col+b);
             }
        }
        
    }
    
};


1 试了几次还是错误。。。。。心累,下次在在找

2016 7.25

2 老是提示超时。问题是没有剪枝。


class Solution {
public:
    void solve(vector<vector<char>>& board) {
        if(!board.size()) return;
        int row=board.size();
        int col=board[0].size();
        
        for(int j=0;j<col;j++)
        {
            dfs(board,0,j);//第一行
            if(row>1)//若只有一行,就没有进行下去的理由
            dfs(board,row-1,j);//最后一行
        }
        for(int i=1;i<row;i++ )
        {
            dfs(board,i,0);//第一列
            if(col>1)//若只有一列,同理
            dfs(board,i,col-1);//最后一列
            
        }
        for(int i=0;i<row;i++)//最后还原
          for(int j=0;j<col;j++)//O转为x,D转为O
         {
             if(board[i][j]=='D')
             board[i][j]='O';
             else if(board[i][j]=='O')
             board[i][j]='X';
         }
        
    }
    
    void dfs(vector<vector<char> >&board,int i,int j)
    {

       //判断数组下标是否越界
        if(i<0||i>=board.size()||j<0||j>=board[0].size()||board[i][j]!='O')
        return ;
        board[i][j]='D';
        if(i>1)//大于一行
        dfs(board,i-1,j);//left
        if(i+1<board.size())
        dfs(board,i+1,j);//right
        if(j>1)//大于一列
        dfs(board,i,j-1);//down
        if(j+1<board[0].size())
        dfs(board,i,j+1);//up
    }
};

1 结论向量下标很重要。

参考资料:http://blog.youkuaiyun.com/u011095253/article/details/9158455

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值