1. 程式人生 > >LintCode 477 被圍繞的區域

LintCode 477 被圍繞的區域

題意:給一個二維的矩陣,包含 ‘X’ 和 ‘O’, 找到所有被 ‘X’ 圍繞的區域,並用 ‘X’ 填充滿。

樣例
給出的二維矩陣:
X X X X
X O O X
X X O X
X O X X

把被 ‘X’ 圍繞的區域填充之後變為:
X X X X
X X X X
X X X X
X O X X

解題思路 1 :
用bfs確定連通區域。 對二維矩陣邊緣的’O’進行bfs把其相鄰的’O’連線為一個區域 , 並對這些區域做標記,例如記為‘’,最後遍歷整個二維矩陣,把連通域‘‘重新記為’O’ ,其他視為’X’ 。

class Solution
{
    public
: void surroundedRegions(vector<vector<char> > &board) { int m = board.size() ; int n = board[0].size() ; for(int i = 0 ; i < m ; i ++) { bfs(board , i , 0 ) ; bfs(board , i , n - 1 ) ; } for(int j = 0 ; j < n ; j ++) { bfs(board , 0
, j ) ; bfs(board , m - 1 , j ) ; } for(int i = 0 ; i < m ; i ++) { for (int j = 0 ; j < n ; j ++) { if(board[i][j] == '*') board[i][j] = 'O' ; else board[i][j] = 'X' ; } } } private
: int dx[4] = {0 , 0 , 1 , -1 } ; int dy[4] = {1 , -1 , 0 , 0 } ; bool isInBoard(int m , int n , int x , int y) { if(x >= 0 && x < m && y >= 0 && y < n ) return true ; return false ; } void bfs(vector<vector<char> > &board , int x , int y) // 注意對board進行傳引用,不然形參board的修改無法傳到實參中 { int m = board.size() ; int n = board[0].size() ; int nx , ny ; if(isInBoard(m , n , x, y) && board[x][y] == 'O' ) { board[x][y] = '*' ; for(int k = 0 ; k < 4 ; k ++) { nx = x + dx[k] ; ny = y + dy[k] ; bfs(board , nx , ny ) ; } } } };

解題思路2 :
用並查集確定連通區域。 把與二維矩陣邊緣的’O’相鄰的’O’合併為一個集合。需要設定一個集合,然後把所有的元素都扔進去。

#include <iostream>
#include "algorithm"

using namespace std ;

class UnionFind
{

    public :
    UnionFind (int N)
    {
        this->count = N ;
        this->id = new int [N+1] ;
       // this->size = new int[N+1] ;

        for (int i = 0 ; i <= this->count ; i++)
        {
            id[i] = i ;
          //  size[i] = 1 ;
        }
    }

    int Find(int p)
    {
        while( p != id[p])
        {
            id[p] = id[id[p]] ;
            p = id[p] ;
        }

        return  p ;
    }

    void Union(int p , int q)
    {
        int fp = this->Find(p) ;
        int fq = this->Find(q) ;
        if(fp == fq)
            return ;
        else
            id[fp] = fq ;

        count -- ;
    }

    bool Connected (int p , int q)
    {
        int fp = this->Find(p) ;
        int fq = this->Find(q) ;
        if (fp == fq )
            return  true ;
        else
            return  false ;
    }

    int Count ()
    {
        return this->count ;
    }
    private:
    int *id ,  count ;
};

class Solution
{
    public:
    vector <vector<char> > Board ;
   Solution (int m)
    {
        vector<char> d ;
        char c ;
        for(int i = 0 ; i < m ; i ++)
        {
            Board.push_back(d) ;
            for (int j = 0 ; j < m ; j ++)
            {
                cin >> c ;
                Board[i].push_back(c)  ;
            }
        }

    }

    bool isEdge (int n , int m , int x , int y)
    {
        if(x == 0 || x == n -1 || y == 0 || y == m -1 )
            return  true ;
        else return false ;
    }

    bool isInBoard(int n , int m , int x , int y)
    {
        if(x >= 0 && x < n && y >= 0 && y < m)
            return true ;
        else return false ;
    }

    void surroundedRegions(vector<vector<char> > &board)
    {
        int n = board.size() ;
        int m = board[0].size() ;
        //cout << "m : " << m << "n : " << n << endl ;
        if(board.empty()|| n == 0 || m == 0 )
            return ;
        UnionFind uf(n*m) ;
        for(int i = 0 ; i < n ; i ++)
        {
            for(int j = 0 ; j < m ; j ++)
            {
                if(board[i][j] == 'O')
                {
                    if(isEdge(n , m , i , j))
                        uf.Union(m*i+j , m * n) ; //把邊緣的'O'放入m*n所在的集合,最後和邊緣'O'相連通的'O'都在集合m*n中。
                    else
                    {
                        for(int k = 0 ; k < 4 ; k ++)
                        {
                            int nx = i + dx[k] ;
                            int ny = j + dy[k] ;
                            if(isInBoard(n , m , nx , ny) && board[nx][ny] == 'O')
                            {
                                uf.Union(m*i + j , m*nx + ny) ;
                            }
                        }
                    }
                }
            }
        }

        for(int i = 0 ; i <  n ; i ++)
        {
            for(int j = 0 ; j < m ; j ++)
            {
                if(!uf.Connected(m*i + j , m *n))
                {
                    board[i][j] = 'X' ;
                }
            }
        }
    }

    void Output()
    {
        int m = this->Board.size() ;
        //cout << "m : " << m << endl ;
        for(int i = 0 ; i < m ; i ++)
        {
            for (int j = 0 ; j < m ; j ++)
            {
                cout << Board[i][j] ;
            }
            cout << endl ;
        }

    }

    private:
    int dx[4] = {0 , 0 , 1 , -1} ;
    int dy[4] = {1 , -1 , 0 , 0} ;

};

int main()
{
   /* vector<vector<char> > board = {
            {'X' , 'X' , 'X' , 'X'} ,
            {'X' , 'O' , 'O' , 'X'} ,
            {'X' , 'X' , 'O' , 'X'} ,
            {'X' , 'O' , 'X' , 'X'}
    };
    Solution s ;
    s.surroundedRegions(board) ;
    int m = board.size() ;
    int n = board[0].size() ;
    for(int i = 0 ; i < m ; i ++)
    {
        for(int j = 0 ; j < n ; j ++)
        {
            cout << board[i][j] ;
        }
        cout << endl ;
    }*/

    Solution s(4) ;
    s.surroundedRegions(s.Board) ;
    s.Output() ;

    return 0;
}

相關推薦

LintCode 477 圍繞區域

題意:給一個二維的矩陣,包含 ‘X’ 和 ‘O’, 找到所有被 ‘X’ 圍繞的區域,並用 ‘X’ 填充滿。 樣例 給出的二維矩陣: X X X X X O O X X X O X X O X X 把被 ‘X’ 圍繞的區域填充之後變為: X X X

lintcode - 圍繞區域

函數 edr you change else param int eof 模擬 1 class Solution { 2 public: 3 /* 4 * @param board: board a 2D board containing

圍繞區域 · Surrounded Regions

post 輸入 找到 num 擴展 deb 空間 分鐘 region [抄題]: 給一個二維的矩陣,包含 ‘X‘ 和 ‘O‘, 找到所有被 ‘X‘ 圍繞的區域,並用 ‘X‘ 填充滿。 樣例 給出二維矩陣: X X X X X O O X X X O X X O X X

LeetCode 圍繞區域

lis self. 連通 spa boa ret pre elf class 給定一個二維的矩陣,包含 ‘X‘ 和 ‘O‘(字母 O)。 找到所有被 ‘X‘ 圍繞的區域,並將這些區域裏所有的 ‘O‘ 用 ‘X‘ 填充。 示例: X X X X X O O X X X O X

[Swift]LeetCode130. 圍繞區域 | Surrounded Regions

Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A region is captured by flipping a

Leetcode 130:圍繞區域(最詳細的解法!!!)

給定一個二維的矩陣,包含 'X' 和 'O'(字母 O)。 找到所有被 'X' 圍繞的區域,並將這些區域裡所有的 'O' 用 'X' 填充。 示例: X X X X X O O X X X O X

LeetCode 130. 圍繞區域(C、C++、python)

給定一個二維的矩陣,包含 'X' 和 'O'(字母 O)。 找到所有被 'X' 圍繞的區域,並將這些區域裡所有的 'O' 用 'X' 填充。 示例: X X X X X O O X X X O X

LeetCode130圍繞區域

題目描述 給定一個二維的矩陣,包含 'X' 和 'O'(字母 O)。 找到所有被 'X' 圍繞的區域,並將這些區域裡所有的 'O' 用 'X' 填充。 示例: X X X X X O O X X X O X X O X X 執行你的函式後,矩陣變為: X X X

【LeetCode】#130圍繞區域(Surrounded Regions)

【LeetCode】#130被圍繞的區域(Surrounded Regions) 題目描述 給定一個二維的矩陣,包含 ‘X’ 和 ‘O’(字母 O)。 找到所有被 ‘X’ 圍繞的區域,並將這些區域裡所有的 ‘O’ 用 ‘X’ 填充。 示例 X X X X X O O X X

leetcode130.圍繞區域

題目: 給定一個二維的矩陣,包含 'X' 和 'O'(字母 O)。 找到所有被 'X' 圍繞的區域,並將這些區域裡所有的 'O' 用 'X' 填充。 示例: X X X X X O O X X

LeetCode-130.圍繞區域(相關話題:深度優先)

給定一個二維的矩陣,包含 'X' 和 'O'(字母 O)。 找到所有被 'X' 圍繞的區域,並將這些區域裡所有的 'O' 用 'X' 填充。 示例: X X X X X O O X X X O X X O X X 執行你的函式後,矩陣變為: X X X X X X X X X X

【LeetCode 中等題】60-圍繞區域

題目描述:給定一個二維的矩陣,包含 'X' 和 'O'(字母 O)。找到所有被 'X' 圍繞的區域,並將這些區域裡所有的 'O' 用 'X' 填充。 示例: X X X X X O O X X

LeetCode 130. 圍繞區域 Pyhton

給定一個二維的矩陣,包含 'X' 和 'O'(字母 O)。 找到所有被 'X' 圍繞的區域,並將這些區域裡所有的 'O' 用 'X' 填充。 示例: X X X X X O O X X X O X X O X X 執行你的函式後,矩陣變為: X X X X X X

LetCode 130. 圍繞區域

class Solution { public: void solve(vector<vector<char>>& board) { if (bo

130.圍繞區域

給定一個二維的矩陣,包含 'X' 和 'O'(字母 O)。 找到所有被 'X' 圍繞的區域,並將這些區域裡所有的 'O' 用 'X' 填充。 示例: X X X X X O O X X X O X X O X X 執行你的函式後,矩陣變為: X X X X X X

leetcode 130. 圍繞區域

這道題我用的逆向思維法,用DFS判斷和邊上’O’連線的’O’,然後將他們標記為星號,標記完全部之後,再遍歷一次陣列,將’O’換為‘X’,’*‘換為O,即可完成。 這個演算法可圈點的地方在於,DFS用的是棧實現的,以前實現DFS總是用遞迴,沒想過非遞迴如何實現,

leetcode 130. Surrounded Regions 圍繞區域 c++

給定一個二維的矩陣,包含 'X' 和 'O'(字母 O)。 找到所有被 'X' 圍繞的區域,並將這些區域裡所有的 'O' 用 'X' 填充。 示例: X X X X X O O X X X O X X O X X 執行你的函式後,矩陣變為: X X X X X X

130圍繞區域

from typing import List# 這道題的思路是從矩陣的四周開始尋找,如果這個字元為O,就向上下左右遞迴,# 先將找到的O轉化為其他字元,最後將沒有找到的O轉化為X,將找到的O不變class Solution: def solve(self, board: List[List[str]]

【LeetCode-面試算法經典-Java實現】【130-Surrounded Regions(圍繞區域)】

pos apt pub iso all 左面 ons || title 【130-Surrounded Regions(圍繞區域)】 【LeetCode-面試算法經典-Java實現】【全部題目文件夾索引】 原題   Given a 2D b

Vue 實現圖片預覽、裁剪並獲取裁剪區域的base64(無元件)

前言     最近公司專案需要用到圖片裁剪技術,便著手寫了一個,可以說是用Vue實現的原生裁剪,畢竟也只是去操作dom,不過vue有個黑魔法,ref屬性,使用的方法和原生dom一模一樣但是更節省dom操作時的消耗 裁剪思路 這邊大致介紹一下裁剪圖片的思路