被围绕的区域

给一个二维的矩阵,包含 '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 problem, only the cells on the
boarders can not be surrounded. So we can first merge those O’s on the boarders like
in Number of Islands and replace O’s with ’#’, and then scan the board and replace all
O’s left (if any)

先将边界中联通的O换成*,这里利用深度优先

最后遍历数组,O->X  *->O,每个位置值遍历一次,不会出现混乱

public class Solution {
/**
* @param board a 2D board containing 'X' and 'O'
* @return void
*/
public void surroundedRegions(char[][] board) {
// Write your code here
if(board == null || board.length == 0|| board[0].length == 0)
return ;
int row = board.length;
int col = board[0].length;
for(int i =0;i< row;i++){
if(board[i][0] == 'O')
merge(board,i,0);
if(board[i][col-1] == 'O')
merge(board,i,col-1);
}
for(int j =0;j< col;j++){
if(board[0][j] == 'O')
merge(board,0,j);
if(board[row-1][j] == 'O')
merge(board,row-1,j);
}
// O->X *->O
for(int i=0;i<row;i++){
for(int j=0; j<col; j++){
if(board[i][j] == 'O'){
board[i][j] = 'X';
}else if(board[i][j] == '*'){
board[i][j] = 'O';
}
}
}
}
// 将边界联通的O 换成 *
public void merge(char[][] board,int row,int col){
if(row<0 || col<0 || row>= board.length || col>= board[0].length)
return;
if(board[row][col] != 'O')
return;
board[row][col] = '*';
merge(board,row,col+1);
merge(board,row+1,col);
merge(board,row-1,col);
merge(board,row,col-1);
}
}
This solution causes java.lang.StackOverflowError, because for a large board, too many method calls are pushed to the stack and causes the overflow.

programcreek 中又给了一个广度优先的算法

比较复杂,先把程序复杂过来

public class Solution {
// use a queue to do BFS
private Queue<Integer> queue = new LinkedList<Integer>(); public void solve(char[][] board) {
if (board == null || board.length == 0)
return; int m = board.length;
int n = board[0].length; // merge O's on left & right boarder
for (int i = 0; i < m; i++) {
if (board[i][0] == 'O') {
bfs(board, i, 0);
} if (board[i][n - 1] == 'O') {
bfs(board, i, n - 1);
}
} // merge O's on top & bottom boarder
for (int j = 0; j < n; j++) {
if (board[0][j] == 'O') {
bfs(board, 0, j);
} if (board[m - 1][j] == 'O') {
bfs(board, m - 1, j);
}
} // process the board
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';
}
}
}
} private void bfs(char[][] board, int i, int j) {
int n = board[0].length; // fill current first and then its neighbors
fillCell(board, i, j); while (!queue.isEmpty()) {
int cur = queue.poll();
int x = cur / n;
int y = cur % n; fillCell(board, x - 1, y);
fillCell(board, x + 1, y);
fillCell(board, x, y - 1);
fillCell(board, x, y + 1);
}
} private void fillCell(char[][] board, int i, int j) {
int m = board.length;
int n = board[0].length;
if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] != 'O')
return; // add current cell is queue & then process its neighbors in bfs
queue.offer(i * n + j);
board[i][j] = '#';
}
}

update

public class Solution {
/**
* @param board a 2D board containing 'X' and 'O'
* @return void
*/
public void surroundedRegions(char[][] board) {
// Write your code here
if(board == null || board.length == 0 || board[0].length ==0)
return;
int row = board.length;
int col = board[0].length;
// 边界的 O 变为 P
for(int i =0;i<row;i++){
if(board[i][0] == 'O')
dfs(board,i,0,row,col);
if(board[i][col-1] == 'O')
dfs(board,i,col-1,row,col);
}
for(int j=0;j<col;j++){
if(board[0][j] == 'O')
dfs(board,0,j,row,col);
if(board[row-1][j] == 'O')
dfs(board,row-1,j,row,col); }
// 中间的 O-> X
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(board[i][j] == 'O')
board[i][j] = 'X';
}
}
// P 还原 O
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(board[i][j] == 'P')
board[i][j] = 'O';
}
}
}
// 将 ij 周围的 O - > P public void dfs(char[][] board,int i,int j,int row,int col){
if(i<0 ||i>=row ||j<0 ||j>=col)
return ;
if(board[i][j]=='O'){
board[i][j] ='P';
dfs(board,i+1,j,row,col);
dfs(board,i,j+1,row,col);
dfs(board,i-1,j,row,col);
dfs(board,i,j-1,row,col);
}
}
}

lintcode:被围绕的区域的更多相关文章

  1. lintcode - 被围绕的区域

    class Solution { public: /* * @param board: board a 2D board containing 'X' and 'O' * @return: nothi ...

  2. [Swift]LeetCode130. 被围绕的区域 | Surrounded Regions

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

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

    (DFS思路对,写复杂了) 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充. 示例: X X X X X O ...

  4. 286被围绕的区域 · Surrounded Regions

    [抄题]: 给一个二维的矩阵,包含 'X' 和 'O', 找到所有被 'X' 围绕的区域,并用 'X' 填充满. 样例 给出二维矩阵: X X X X X O O X X X O X X O X X ...

  5. lintcode-477-被围绕的区域

    477-被围绕的区域 给一个二维的矩阵,包含 'X' 和 'O', 找到所有被 'X' 围绕的区域,并用 'X' 填充满. 样例 给出二维矩阵: X X X X X O O X X X O X X O ...

  6. 130 Surrounded Regions 被围绕的区域

    给定一个二维的矩阵,包含 'X' 和 'O'(字母 O), 找到所有被 'X' 围绕的区域.并将区域里所有 'O'用 'X' 填充.例如,X X X XX O O XX X O XX O X X运行你 ...

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

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

  8. LeetCode 被围绕的区域

    给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充. 示例: X X X X X O O X X X O X X ...

  9. LeetCode 130. 被围绕的区域(Surrounded Regions)

    题目描述 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充. 示例: X X X X X O O X X X ...

随机推荐

  1. linux CentOS 系统下如何将php和mysql命令加入到环境变量中

    在Linux CentOS系统上安装完php和MySQL后,为了使用方便,需要将php和mysql命令加到系统命令中,如果在没有添加到环境变量之前,执行“php -v”命令查看当前php版本信息时时, ...

  2. Linux 编辑器

    vim编辑器 vi作为Unix上的一个编辑器,一直广受欢迎.之后GUN将其移植到开源世界中,经过开发人员对其进行了改善,被称为vi improved,就是现在的vim.为了方便使用,几乎所有的Linu ...

  3. Ubuntu系统安装配置Pintos和Bochs

    Ubuntu系统安装配置 Pintos 和 Bochs 安装过程 首先是UEFI启动模式下Win8.1安装Ubuntu14.04双系统,由于篇幅过长,就不在这里详写.可见博主的另一篇博客http:// ...

  4. SQL SERVER发布与订阅 [原创]

    一.配置分发 1.配置分发服务器,注:配置发布与订阅,连接SQLSERVER必须用服务器名登录 2.配置分发 3.选择分发服务器 4.选择快照文件夹 5.设置此文件夹的读写权限为everyone 6. ...

  5. java基础学习之对象转型

    对象转型(casting): 1)一个基类的引用类型变量可以指向其子类的对象 2)一个基类的引用不可以访问其子类对象新增加的成员(属性和方法) 3)可以使用引用变量instanceof类名,来判断该引 ...

  6. jQuery中ready与load事件

    jQuery中ready与load事件(来自慕课网) jQuery有3种针对文档加载的方法 $(document).ready(function() { // ...代码... }) //docume ...

  7. 安装Windows7出现:”安装程序无法创建新的系统分区 也无法定位系统分区“ 终极解决方案

    参考:地址 解决方法: 1.先格式化一下你要装的那个盘,然后,拔出U盘,啥也别动,只拔出U盘就行,再装上U盘,然后刷新一下[选硬盘那里的高级选项中有格式化和刷新],再选择要安装的硬盘点下一步,OK了, ...

  8. android开发支付宝接口开发流程(密钥篇)

    参考博客:http://blog.it985.com/12276.html 官方下载地址:http://download.alipay.com/public/api/base/WS_MOBILE_PA ...

  9. 《Soft Skill》一书中的好句子

    The biggest mistake that you can make is to believe that you are working for somebody else. Job secu ...

  10. mongoDB 入门指南、示例

    一.准备工作 1. 下载mongoDB 下载地址:http://www.mongodb.org/downloads 选择合适你的版本 相关文档:http://www.mongodb.org/displ ...