Surrounded Regions结题报告

本文详细阐述了解决迷宫问题的方法,通过标记边界O元素,找到并处理内部O元素,实现区域的捕捉。文章提供了一种有效的搜索算法,以及两种标记策略的对比分析。

摘要生成于 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
思路:这道题如果按题意从里往外找会很麻烦,如果从边界以此判断是否为'O',然后找出与这些'O'相连的O,并标记,最后将未标记的元素全部置为X,标记的置为O,完成代码。至于怎么标记,有两种方法,刚开始我重新开了一个二维矩阵标记元素,后来发现直接在原矩阵里标记也可以。

这是我第一遍的代码:

class Solution {
public:
    void searchit(bool **visit,vector<vector<char>> &board,int m,int n,int i,int j)
    {
        if(i-1>=0&&visit[i-1][j]==false&&board[i-1][j]=='O')
        {
            visit[i-1][j]=true;
            searchit(visit,board,m,n,i-1,j);
        }
        if(i+1<m&&visit[i+1][j]==false&&board[i+1][j]=='O')
        {
            visit[i+1][j]=true;
            searchit(visit,board,m,n,i+1,j);
        }
        if(j-1>=0&&visit[i][j-1]==false&&board[i][j-1]=='O')
        {
            visit[i][j-1]=true;
            searchit(visit,board,m,n,i,j-1);
        }
        if(j+1<m&&visit[i][j+1]==false&&board[i][j+1]=='O')
        {
            visit[i][j+1]=true;
            searchit(visit,board,m,n,i,j+1);
        }
    }
    void solve(vector<vector<char>> &board) {
        int row=board.size();
        if(row==0)return;
        int col=board[0].size();
        bool **visit=new bool*[row];
        for(int i=0;i<row;i++)
        visit[i]=new bool[col];
        for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
        visit[i][j]=false;
        for(int i=0;i<col;i++)
        {
            if(board[0][i]=='O'&&visit[0][i]==false)
            {
                visit[0][i]=true;
                searchit(visit,board,row,col,0,i);
            }
            if(board[row-1][i]=='O'&&visit[row-1][i]==false)
            {
                visit[row-1][i]=true;
                searchit(visit,board,row,col,row-1,i);
            }
        }
        for(int i=1;i<row-1;i++)
        {
            if(board[i][0]=='O'&&visit[i][0]==false)
            {
                visit[i][0]=true;
                searchit(visit,board,row,col,i,0);
            }
            if(board[i][col-1]=='O'&&visit[i][col-1]==false)
            {
                visit[i][col-1]=true;
                searchit(visit,board,row,col,i,col-1);
            }
        }
        for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
        {
            if(visit[i][j])
            board[i][j]='O';
            else
            board[i][j]='X';
        }
        return;
    }
};
由于爆栈,RE了,一直不明白怎么改,后来参考其他人的,稍加修改,可以AC了。代码如下:

class Solution {
public:
    void searchit(bool **visit,vector<vector<char>> &board,int m,int n,int i,int j)
    {
        if(i-1>=0&&visit[i-1][j]==false&&board[i-1][j]=='O')
        {
            visit[i-1][j]=true;
            searchit(visit,board,m,n,i-1,j);
        }
        if(i+1<m&&visit[i+1][j]==false&&board[i+1][j]=='O')
        {
            visit[i+1][j]=true;
            searchit(visit,board,m,n,i+1,j);
        }
        if(j-1>=0&&visit[i][j-1]==false&&board[i][j-1]=='O')
        {
            visit[i][j-1]=true;
            searchit(visit,board,m,n,i,j-1);
        }
        if(j+1<m&&visit[i][j+1]==false&&board[i][j+1]=='O')
        {
            visit[i][j+1]=true;
            searchit(visit,board,m,n,i,j+1);
        }
    }
    void solve(vector<vector<char>> &board) {
        int row=board.size();
        if(row==0)return;
        int col=board[0].size();
        bool **visit=new bool*[row];
        for(int i=0;i<row;i++)
        visit[i]=new bool[col];
        for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
        visit[i][j]=false;
        for(int i=0;i<col;i++)
        {
            if(board[0][i]=='O'&&visit[0][i]==false)
            {
                visit[0][i]=true;
                
            }
            if(board[row-1][i]=='O'&&visit[row-1][i]==false)
            {
                visit[row-1][i]=true;
               
            }
        }
        for(int i=1;i<row-1;i++)
        {
            if(board[i][0]=='O'&&visit[i][0]==false)
            {
                visit[i][0]=true;
            
            }
            if(board[i][col-1]=='O'&&visit[i][col-1]==false)
            {
                visit[i][col-1]=true;
               
            }
        }
        for(int i=0;i<col;i++)
        {
            if(board[0][i]=='O')
            {
              
                searchit(visit,board,row,col,0,i);
            }
            if(board[row-1][i]=='O')
            {
           
                searchit(visit,board,row,col,row-1,i);
            }
        }
        for(int i=1;i<row-1;i++)
        {
            if(board[i][0]=='O')
            {
          
                searchit(visit,board,row,col,i,0);
            }
            if(board[i][col-1]=='O')
            {
           
                searchit(visit,board,row,col,i,col-1);
            }
        }
        for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
        {
            if(visit[i][j])
            board[i][j]='O';
            else
            board[i][j]='X';
        }
        return;
    }
};
还有一种比较好的标记办法,将需要标记的元素置为M(或者其他字母),最后将这些标记的置为O,其他的置为X。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值