leetcode[130] Surrounded Regions

给定一个类似棋盘,有X和O,把X圈住的O变为X例如:

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就是被圈住的,就需要转化为X,然后其他标记的符号就要转为原来的O。这个叫做DFS。

class Solution
{
    public:
    void dfs(vector<vector<char> > &board, int x, int y)
    {
        if(x<0 || x>=board.size() || y<0 || y>=board[0].size() || board[x][y]!=‘O‘) return;
        board[x][y]=‘#‘;
        dfs(board, x-1,y);
        dfs(board, x+1,y);
        dfs(board, x,y-1);
        dfs(board, x,y+1);
    }

    void solve(vector<vector<char> > &board)
    {
        if (board.size() < 3) return ;
        if (board[0].size() < 3) return ;
        int m = board.size(), n = board[0].size();
        for(int j=0;j<n;j++)
        {
            dfs(board,0,j);
            dfs(board,m-1,j);
        }
        for(int i=1;i<m-1;i++)
        {
            dfs(board,i,0);
            dfs(board,i,n-1);
        }
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
            {
                if(board[i][j]==‘O‘) board[i][j]=‘X‘;
                else if(board[i][j]==‘#‘) board[i][j]=‘O‘;
            }
    }
};

代码就是对上下左右每个边开始DFS解决。可是会栈溢出,哎,这个error略高级,一直摸不清。

如果把DFS的函数改为如下的形式,就可以AC了。

不同之处就是上面的dfs中判断了上下左右,而下面这个的上下左右是在主函数里,dfs是对内层处理。

class Solution
{
    public:
    void dfs(vector<vector<char>> &board, int i, int j)
    {
        int row = board.size(), col = board[0].size();
        if(i > 1 && board[i-1][j] == ‘O‘)
        {
            board[i-1][j] = ‘#‘;
            dfs(board, i-1, j);
        }
        if(i < row-1 && board[i+1][j] == ‘O‘)
        {
            board[i+1][j] = ‘#‘;
            dfs(board, i+1, j);
        }
        if(j > 1 && board[i][j-1] == ‘O‘)
        {
            board[i][j-1] = ‘#‘;
            dfs(board, i, j-1);
        }
        if(j < col-1 && board[i][j+1] == ‘O‘)
        {
            board[i][j+1] = ‘#‘;
            dfs(board, i, j+1);
        }
    }

    void solve(vector<vector<char> > &board)
    {
        if (board.size() < 3) return ;
        if (board[0].size() < 3) return ;
        int m = board.size(), n = board[0].size();
        for(int j=0;j<n;j++)
        {
            if (board[0][j] == ‘O‘)
            {
                board[0][j] = ‘#‘;
                dfs(board,0,j);
            }
            if (board[m-1][j] == ‘O‘)
            {
                board[m-1][j] = ‘#‘;
                dfs(board,m-1,j);
            }
        }
        for(int i=1;i<m-1;i++)
        {
            if (board[i][0] == ‘O‘)
            {
                board[i][0] = ‘#‘;
                dfs(board,i,0);
            }
            if (board[i][n-1] == ‘O‘)
            {
                board[i][n-1] = ‘#‘;
                dfs(board,i,n-1);
            }
        }
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
            {
                if(board[i][j]==‘O‘) board[i][j]=‘X‘;
                else if(board[i][j]==‘#‘) board[i][j]=‘O‘;
            }
    }
};

改天再试试BFS

时间: 2024-10-24 01:55:12

leetcode[130] Surrounded Regions的相关文章

leetcode 130 Surrounded Regions(BFS)

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

Java for LeetCode 130 Surrounded Regions

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 XX O O XX X O XX O X X After running your function, the board should be:

[LeetCode]130 Surrounded Regions(DFS)

题目链接:https://leetcode.com/problems/surrounded-regions/?tab=Description 题意:把非边界的O改成X. 先dfs边界的,打好标记.把没变的变成X后同时更新标记的为O. 1 class Solution { 2 public: 3 const int dx[5] = {0, 0, 1, -1}; 4 const int dy[5] = {1, -1, 0, 0}; 5 int n, m; 6 bool ok(int x, int y

Leetcode 130 Surrounded Regions DFS

将内部的O点变成X input X X X XX O O X X X O XX O X X output X X X XX X X XX X X XX O X X DFS图所有边上的点,将边上的O以及其联通域变为T,然后将内部的O变为X,外部的T变为O,本质是种子填充算法. 此题对于is_in这个函数要注意, 不要用(x < m) && (x >= 0) && (y < n) && (y >= 0) 会堆栈溢出!!原因是会出现边上的点

LeetCode OJ - Surrounded Regions

我觉得这道题和传统的用动规或者贪心等算法的题目不同.按照题目的意思,就是将被'X'围绕的'O'区域找出来,然后覆盖成'X'. 那问题就变成两个子问题: 1. 找到'O'区域,可能有多个区域,每个区域'O'都是相连的: 2. 判断'O'区域是否是被'X'包围. 我采用树的宽度遍历的方法,找到每一个'O'区域,并为每个区域设置一个value值,为0或者1,1表示是被'X'包围,0则表示不是.是否被'X'包围就是看'O'区域的边界是否是在2D数组的边界上. 下面是具体的AC代码: class Boar

leetcode --day12 Surrounded Regions &amp; Sum Root to Leaf Numbers &amp; Longest Consecutive Sequence

1.  Surrounded Regions 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 fu

[LeetCode][JavaScript]Surrounded Regions

Surrounded Regions 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

【LeetCode】 Surrounded Regions (BFS &amp;&amp; DFS)

题目:Surrounded Regions 广搜和深搜都能解决,但是LeetCode上使用深搜时会栈溢出 DFS: <span style="font-size:18px;">/*LeetCode Surrounded Regions * 题目:给定一个字符数组,由'X'和'O'组成,找到所有被x包围的o并将其替换为x * 思路:只要替换被包围的o就行,如果有一个o是边界或者上下左右中有一个是o且这个o不会被替换,则该点也不会被替换 * 从四条边开始,因为在这4周的一定不是

[LeetCode] 130. Surrounded Regions_Medium tag: DFS

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. Example: X X X X X O O X X X O X X O X X After running your function, the bo