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

题目大意:给一个棋盘,上面有'X'和'O',找出所有被'X'包围的'O',并替换成'X'。

解题思路:

解法一:从边开始,找出在四条边上的O,以BFS的方式找出所有与边上的O连通的O,这些O都是不被包围的,将这些O替换为某个特殊字符,遍历完之后,将O替换为X,将特殊字符替换为O。

解法二:直接用BFS遍历,找到一个O之后,加入BFS队列,找出与之连通的所有的O同时判断这些O是否被包围(即是否位于某条边上),将这些O加入一个List,每一个连通的O区域用一个surround布尔变量表示这个连通区域是否是被surround的,如果是就把这些O替换为X,否则不替换并继续遍历其他。

注意:这里因为要把i、j下标放入队列或者结果集,一开始我使用String类型key= i+"_"+j 来处理,后来看到别人key = i * colLen + j ; colLen是棋盘的列的数量,然后用key/colLen,key%colLen来得到i,j下标效率更高。

Talk is cheap>>

解法一:

  public void solve(char[][] board) {
Queue<Integer> queue = new ArrayDeque<>();
int rowLen = board.length;
if (rowLen == 0)
return;
int colLen = board[0].length;
int[][] adj = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
for (int i = 0; i < rowLen; i++) {
for (int j = 0; j < colLen; j++) {
          //如果O在四条边上
if (board[i][j] == 'O' && (i == 0 || j == 0 || i == rowLen - 1 || j == colLen - 1)) {
int key = i * colLen + j;
board[i][j] = '1';
queue.add(key);
while (!queue.isEmpty()) {
              //BFS遍历与边上的O连通的O
key = queue.poll();
int x = key / colLen;
int y = key % colLen;
for (int k = 0; k < 4; k++) {
int adj_x = x + adj[k][0];
int adj_y = y + adj[k][1];
if (adj_x >= 0 && adj_y >= 0 && adj_x < rowLen && adj_y < colLen) {
if (board[adj_x][adj_y] == 'O') {
int pos = adj_x * colLen + adj_y;
board[adj_x][adj_y]='1';
queue.add(pos);
}
}
}
}
}
}
}
for (int i = 0; i < rowLen; i++) {
for (int j = 0; j < colLen; j++) {
if (board[i][j] == 'O') {
board[i][j] = 'X';
} else if (board[i][j] == '1') {
board[i][j] = 'O';
}
}
}
}

解法二:

  public void solve(char[][] board) {
Queue<Integer> queue = new ArrayDeque<>();
int rowLen = board.length;
if (rowLen == 0) {
return;
}
int[][] adj = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
int colLen = board[0].length;
boolean[][] visited = new boolean[rowLen][colLen];
for (int i = 0; i < rowLen; i++) {
for (int j = 0; j < colLen; j++) {
if (!visited[i][j] && board[i][j] == 'O') {
            //标准的BFS遍历
boolean surround = true;
List<Integer> toHandle = new ArrayList<>();
queue.add(i * colLen + j);
while (!queue.isEmpty()) {
int key = queue.poll();
toHandle.add(key);
int x = key / colLen;
int y = key % colLen;
for (int k = 0; k < 4; k++) {
                //检查O的上下左右
int adj_x = x + adj[k][0];
int adj_y = y + adj[k][1];
if (adj_x >= 0 && adj_y >= 0 && adj_x < rowLen && adj_y < colLen) {
                  //都不在边上
if (board[adj_x][adj_y] == 'O' && !visited[adj_x][adj_y]) {
int pos = adj_x * colLen + adj_y;
queue.add(pos);
visited[adj_x][adj_y] = true;
}
} else {
                  //有一个在边上,置surround=false
surround = false;
}
}
}
if (surround) {
for (int key : toHandle) {
board[key / colLen][key % colLen] = 'X';
}
}
}
}
}
}

Surrounded Regions——LeetCode的更多相关文章

  1. Surrounded Regions leetcode java

    题目: Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is capt ...

  2. Surrounded Regions - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 https://leetcode.com/problems/surrounded-regions/ 注意点 边缘不算包围'O' 解法 解法一:dfs.找处 ...

  3. [LeetCode] Surrounded Regions 包围区域

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

  4. 验证LeetCode Surrounded Regions 包围区域的DFS方法

    在LeetCode中的Surrounded Regions 包围区域这道题中,我们发现用DFS方法中的最后一个条件必须是j > 1,如下面的红色字体所示,如果写成j > 0的话无法通过OJ ...

  5. 【LeetCode】130. Surrounded Regions (2 solutions)

    Surrounded Regions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A ...

  6. Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions)

    Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions) 深度优先搜索的解题详细介绍,点击 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O) ...

  7. [LeetCode] 130. Surrounded Regions 包围区域

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

  8. 【leetcode】Surrounded Regions

    Surrounded Regions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A ...

  9. leetcode 200. Number of Islands 、694 Number of Distinct Islands 、695. Max Area of Island 、130. Surrounded Regions

    两种方式处理已经访问过的节点:一种是用visited存储已经访问过的1:另一种是通过改变原始数值的值,比如将1改成-1,这样小于等于0的都会停止. Number of Islands 用了第一种方式, ...

随机推荐

  1. Scala的一些语言特点

    1. 所有的基本数据类型都是对象,比如数值1的所说的类是 scala.Int 2. 所有的运算符都是类成员方法,比如1+2调用1.+(2); 0 to 2 调用 0.to(2) 3. 数组的访问也是通 ...

  2. Eclipse中使用git把项目导入到osc@git中

    方便Eclipse用户使用Git把项目导入到osc@git中进行管理. Eclipse Git osc@git 一.原有项目:  项目名为TestGit 二.在osc@git上面创建一个新项目库. 填 ...

  3. Android(java)学习笔记235:多媒体之计算机图形表示方式

    1.多媒体 很多媒体:文字(TextView,简单不讲),图片,声音,视频等等.   2.图片 计算机如何表示图片的? (1)bmp 高质量保存    256色位图:图片中的每个像素点可以有256种颜 ...

  4. 把某个asp.net 控件 替换成 自定义的控件

    功能:可以把某个asp.net 控件 替换成 自定义的控件 pages 的 tagMapping 元素(ASP.NET 设置架构) 定义一个标记类型的集合,这些标记类型在编译时重新映射为其他标记类型. ...

  5. 带A圈的秘密

    真嗒安全策略的罗罗,,害的我和其他的不一样.

  6. Swift - 11 - nil聚合运算

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  7. WPF 依赖属性与依赖对象

    在介绍依赖属性之前,我先介绍下属性的历史 属性的历史:      早期C++的类中,只有字段及方法,暴露数据靠的是方法, 但是字段直接暴露会不安全,所以才用方法来暴露,在设置的时候加些约束,在MFC中 ...

  8. c/c++内存机制(一)(转)

    转自:http://www.cnblogs.com/ComputerG/archive/2012/02/01/2334898.html 一:C语言中的内存机制 在C语言中,内存主要分为如下5个存储区: ...

  9. 【USACO 3.2.6】香甜的黄油

    [描述] 农夫John发现做出全威斯康辛州最甜的黄油的方法:糖.把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油.当然,他将付出额外的费 ...

  10. Java学习----方法的重载

    一个类中有多个同名的参数不一样的方法. 作用:可以根据不同的条件调用不同的方法. 注意:java不会因为方法的返回类型或者权限的不同而判断为不同的两个方法. public class Student ...