被围绕的区域

给一个二维的矩阵,包含 '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. [笔记]一个测试浏览器对html5支持的网站

    用需要测试的浏览器打开这个地址:http://html5test.com/

  2. 32.DDR2仿真结果

    在STG之前,做了下Modelim,可以进行读写测试,关于速度的研究还需要看手册 数据终于出来了

  3. QT 十六进制字符串转化为十六进制编码

    /*************************************************Function: hexStringtoByteArray()Description: 十六进制字 ...

  4. PHP URL 重定向 的三种方法(转载)

    为了方便查询,转载一篇. 1.使用header()函数    PHP的HTTP相关函数种提供了一个 header()函数,首先要清楚,header()函数必须放在php程序的开头部分,而且之前不能有另 ...

  5. 11.5Daily Scrum

    人员 任务分配完成情况 明天任务分配 王皓南 实现网页上视频浏览的功能.研究相关的代码和功能.811 数据库测试 申开亮 实现网页上视频浏览的功能.研究相关的代码和功能.812 实现视频浏览的功能 王 ...

  6. 结队开发项目—NABC模型

    特点:可以避免食堂的用餐高峰,从而使使用者节约时间 need:很多学生中午下课在食堂吃饭会遭遇用餐高峰,使用这款软件,可以提前订饭,按时送达,从而避免食堂的用餐高峰期. approach:学生可以提前 ...

  7. 【Subsets】cpp

    题目: Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset ...

  8. linshiwendang12--匈牙利

    #include<bits/stdc++.h> #define N 10007 using namespace std; vector<int> p[N]; bool vis[ ...

  9. Detecting diabetic retinopathy in eye images

    Detecting diabetic retinopathy in eye images The past almost four months I have been competing in a  ...

  10. BZOJ: 1084: [SCOI2005]最大子矩阵

    NICE 的DP 题,明白了题解真是不错. Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1228  Solved: 622[Submit][Stat ...