130被围绕的区域

题目:给定一个二维的矩阵,包含 ‘X‘ 和 ‘O‘字母 O)。找到所有被 ‘X‘ 围绕的区域,并将这些区域里所有的 ‘O‘‘X‘ 填充。

来源:https://leetcode-cn.com/problems/surrounded-regions/

法一:自己的代码

思路:先绕外围走一圈,将所有与外围相连的岛屿都标记为True,然后把bool数组中位置为False的置为‘X’,为了节省空间可以直接将外围的‘O’,改为‘A’,然后再替换。

from typing import List
class Solution:
    def solve(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        r_length = len(board)
        if r_length <= 2:
            return
        c_length = len(board[0])
        if c_length <= 2:
            return
        directions = [[0,1],[0,-1],[1,0],[-1,0]]
        marked = [[False] * c_length for i in range(r_length)]
        # 定义用于标记的函数
        def judge(r,c):
            # 如果没有被遍历过,且为‘O‘则进行遍历
            if not marked[r][c] and board[r][c] == ‘O‘:
                # 先将该位置置为True
                marked[r][c] = True
                # 将与该位置相连的所有‘O’都置为True,表示已经遍历过,
                queue = []
                queue.append((r,c))
                while queue:
                    r,c = queue.pop(0)
                    for p,q in directions:
                        # 注意这里的新位置要用新的变量存储,不可用原先的r,c
                        r_new = r + p
                        c_new = c + q
                        if 0 <= r_new < r_length and 0 <= c_new < c_length and board[r_new][c_new] == ‘O‘ and not marked[r_new][c_new]:
                            # 放入队列,等待遍历
                            queue.append((r_new,c_new))
                            # 遍历过的位置,且为‘O‘的都置为True,
                            marked[r_new][c_new] = True
        # 先遍历最外围一圈,把与最外层相连的岛屿标记为True
        for r in range(r_length):
            if r in [0,r_length-1]:
                for c in range(c_length):
                    judge(r, c)
            else:
                for c in [0,c_length-1]:
                    judge(r, c)
        print(marked)
        # 最后将中间的‘O‘变为’X‘
        for r in range(1, r_length):
            for c in range(1, c_length):
                if not marked[r][c]:
                    board[r][c] = ‘X‘
        print(board)
if __name__ == ‘__main__‘:
    solution = Solution()
    # result = solution.solve([["X","X","X","X"],
    #                          ["X","O","O","X"],
    #                          ["X","X","O","X"],
    #                          ["X","O","X","X"]])
    result = solution.solve([["X","X","X","X"],
                             ["X","O","O","X"],
                             ["X","X","O","X"],
                             ["X","O","X","X"]]

ttt

原文地址:https://www.cnblogs.com/xxswkl/p/12292916.html

时间: 2024-08-11 20:40:58

130被围绕的区域的相关文章

算法-被围绕的区域

做面试题,做面试题! 题意: 给一个二维的矩阵,包含 '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.解题思路 这个题最重要的一个特点就是,我们需要将被围绕起来的O换成X

lintcode:被围绕的区域

被围绕的区域 给一个二维的矩阵,包含 '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 解题参考岛屿的个数 然而我还是写不出来programcreek 有下面的一段话: This problem is similar to Number of Islands. In this pr

被围绕的区域 &#183; Surrounded Regions

[抄题]: 给一个二维的矩阵,包含 '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 [暴力解法]: 时间分析: 空间分析: [思维问题]: 找四周都是平原的盆地感觉不好找:可以尝试逆向思维,找开了口和外界有联系的盆地 "注水"的过程通过图形化抽象后再用数学表达出来是bf

【1】【leetcode-130】 被围绕的区域

(DFS思路对,写复杂了) 给定一个二维的矩阵,包含 '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 X X X O X X 解释 被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'. 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为

lintcode - 被围绕的区域

1 class Solution { 2 public: 3 /* 4 * @param board: board a 2D board containing 'X' and 'O' 5 * @return: nothing 6 */ 7 bool flag[220][220]; 8 vector<pair<int, int>> v; 9 const int dir[4][2] = {{0,1}, {1,0}, {0, -1}, {-1, 0}}; 10 int isChange

130. 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 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, th

leetccode-130-被围绕的区域

题目描述: 方法一:dfs class Solution: def solve(self, board: List[List[str]]) -> None: """ Do not return anything, modify board in-place instead. """ if not board or len(board)<=2 or len(board[0])<=2: return row = len(board)

DFS+并查集思想求被围绕的区域

class Solution { private int[][] dir= {{0,-1},{-1,0},{0,1},{1,0}}; private boolean[][] used; public boolean isMove(char[][] board,int x,int y) { if(x>=0&&x<board.length&&y>=0&&y<board[0].length) return true; return fals

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表