• lintcode477- Surrounded Regions- medium


    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.

    Example

    X X X X
    X O O X
    X X O X
    X O X X
    

    After capture all regions surrounded by 'X', the board should be:

    X X X X
    X X X X
    X X X X
    X O X X

    BFS。问题转换:一个0被x包围,等价于其不能连到地图外面。那如果对边缘一圈的O做BFS,碰到的O肯定都是能连到地图外的O,那就标记为‘W’(灌水)。最后再遍历一次地图,让所有被灌水的回到‘O’,其他的都归为‘X’即可。

    数据结构:二维数组,统一一下函数都x,y传,数组调用都int[y][x],x和w比y和h比,这样没问题。

    细节:棋盘题进行上下左右移动可以借助int[] dx = {0, -1, 0, 1}; int[] dy = {-1, 0, 1, 0}; ,之后for(4) {newX = x + dx[i], newY = y + dy[i]}来做。

    public class Solution {
        /*
         * @param board: board a 2D board containing 'X' and 'O'
         * @return: nothing
         */
        public void surroundedRegions(char[][] board) {
            // write your code here
            if (board.length == 0 || board[0].length == 0) {
                return;
            }
            int h = board.length;
            int w = board[0].length;
            
            for (int i = 0; i < w; i++) {
                bfs(board, 0, i);
                bfs(board, h - 1, i);
            }
            
            for (int j = 0; j < h; j++) {
                bfs(board, j, 0);
                bfs(board, j, w - 1);
            }
            
            for (int i = 0; i < w; i++) {
                for (int j = 0; j < h; j++) {
                    if (board[j][i] == 'W') {
                        board[j][i] = 'O';
                    } else {
                        board[j][i] = 'X';
                    }
                }
            }
        }
        
        private void bfs(char[][] board, int sy, int sx) {
            
            if (board[sy][sx] == 'X') {
                return;
            }
            
            int h = board.length;
            int w = board[0].length;
            // 别写成0101
            int[] dx = {0, -1, 0, 1};
            int[] dy = {-1, 0, 1, 0};
            
            board[sy][sx] = 'W';
            for (int i = 0; i < 4; i++) {
                int cy = sy + dy[i];
                int cx = sx + dx[i];
                if (cx >= 0 && cx < w && cy >= 0 && cy < h && board[cy][cx] == 'O') {
                    bfs(board, cy, cx);
                }
            }
        }
    }
  • 相关阅读:
    汇编语言 第三章 寄存器
    汇编语言 第二章
    实验一 查看CPU和内存,用机器指令和汇编指令教程
    nginx的log、upstream和server
    高并发情况下Linux系统及kernel参数优化
    二进制方式安装docker(非root用户启动docker)
    redis
    redis配置文件详解
    Keepalived+LVS实现LNMP网站的高可用部署
    Nginx location相关配置说明
  • 原文地址:https://www.cnblogs.com/jasminemzy/p/7741098.html
Copyright © 2020-2023  润新知