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

思路:

反向思考,先找到没有被包围的区域,标记为‘+’,再把标为‘+’的区域标为‘O',标为’O'的区域改为‘X'。没有被包围的区域一定是与最外圈的’O'相连的区域,所以要先遍历区域的上下左右边界,找到‘O'的地方。接下来的问题是如何把所有与最外层‘O'相连的区域标记上。有两种思路:BFS和DFS。

所谓BFS是指把当前标记位置的上下左右都标记一遍,然后再标记相邻点的上下左右位置。不需递归,用队列。

DFS是指把当前标记位置的向一个方向标记,比如一直向左,直到没有可标记的,再换一个方向。需要递归。

代码里面BFS可以通过,DFS栈溢出了。

void solve(vector<vector<char>> &board) {
if(board.size() == ) return;
int rowNum = board.size();
int colNum = board[].size();
//遍历最外面一圈,找‘O'
//最上
for(int j = ; j < colNum; j++)
{
if(board[][j] == 'O')
BFS(board, , j);
}
//最下
for(int j = ; j < colNum; j++)
{
if(board[rowNum - ][j] == 'O')
BFS(board, rowNum - , j);
}
//最左
for(int i = ; i < rowNum; i++)
{
if(board[i][] == 'O')
BFS(board, i, );
}
//最右
for(int i = ; i < rowNum; i++)
{
if(board[i][colNum - ] == 'O')
BFS(board, i, colNum - );
} for(int i = ; i < rowNum; i++)
{
for(int j = ; j < colNum; j++)
{
if(board[i][j] == 'O')
board[i][j] = 'X';
if(board[i][j] == '+')
board[i][j] = 'O';
}
} }
void DFS(vector<vector<char>> &board, int r, int c)
{
if(r >= && c >= && r < board.size() && c < board[].size() && board[r][c] == 'O')
{
board[r][c] = '+';
DFS(board, r - , c);
DFS(board, r + , c);
DFS(board, r, c - );
DFS(board, r, c + );
}
}
void BFS(vector<vector<char>> &board, int r, int c)
{
queue<pair<int, int>> q;
q.push(make_pair(r, c));
while(!q.empty())
{
int i = q.front().first;
int j = q.front().second;
q.pop();
if(i >= && j >= && i < board.size() && j < board[].size() && board[i][j] == 'O')
{
board[i][j] = '+';
q.push(make_pair(i - , j));
q.push(make_pair(i + , j));
q.push(make_pair(i, j - ));
q.push(make_pair(i, j + ));
} } }

上面的代码已经是优化过的了,我自己写的时候只写出了DFS的,而且自己也没有意识到是DFS。代码也很繁琐。注意通过把判断条件放在一起来简化代码。

我原本很挫的代码:栈溢出。

class Solution {
public:
void solve(vector<vector<char>> &board) {
if(board.size() == ) return;
int rowNum = board.size();
int colNum = board[].size();
//遍历最外面一圈,找‘O'
//最上
for(int j = ; j < colNum; j++)
{
if(board[][j] == 'O')
{
board[][j] = '+';
mySolve(board, , j);
}
}
//最下
for(int j = ; j < colNum; j++)
{
if(board[rowNum - ][j] == 'O')
{
board[rowNum - ][j] = '+';
mySolve(board, rowNum - , j);
}
}
//最左
for(int i = ; i < rowNum; i++)
{
if(board[i][] == 'O')
{
board[i][] = '+';
mySolve(board, i, );
}
}
//最右
for(int i = ; i < rowNum; i++)
{
if(board[i][colNum - ] == 'O')
{
board[i][colNum - ] = '+';
mySolve(board, i, colNum - );
}
} for(int i = ; i < rowNum; i++)
{
for(int j = ; j < colNum; j++)
{
if(board[i][j] == 'O')
board[i][j] = 'X';
if(board[i][j] == '+')
board[i][j] = 'O';
}
} }
void mySolve(vector<vector<char>> &board, int r, int c)
{
if(r - >= && board[r - ][c] == 'O') //上
{
board[r - ][c] == '+';
mySolve(board, r - , c);
}
if(r + < board.size() && board[r + ][c] == 'O') //下
{
board[r + ][c] == '+';
mySolve(board, r + , c);
}
if(c - >= && board[r][c - ] == 'O') //左
{
board[r][c - ] == '+';
mySolve(board, r, c - );
}
if(c + < board[].size() && board[r][c + ] == 'O') //下
{
board[r][c + ] == '+';
mySolve(board, r, c + );
}
}
};

【leetcode】Surrounded Regions(middle)☆的更多相关文章

  1. 【leetcode】Reverse Integer(middle)☆

    Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 总结:处理整数溢出 ...

  2. 【leetcode】Reorder List (middle)

    Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do thi ...

  3. 【leetcode】Word Break (middle)

    Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...

  4. 【leetcode】Rotate List(middle)

    Given a list, rotate the list to the right by k places, where k is non-negative. For example:Given 1 ...

  5. 【leetcode】Partition List(middle)

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  6. 【leetcode】Spiral Matrix(middle)

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...

  7. 【leetcode】Rotate Image(middle)

    You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...

  8. 【leetcode】Next Permutation(middle)

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  9. 【leetcode】Reverse Bits(middle)

    Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...

随机推荐

  1. 国内SEO如何过滤掉不良网络信息

    对于站长们来说,首要任务就是和搜索引擎战斗,面对搜索引擎算法的不断更新,站长们也更加头疼.站长们都觉得,搜索引擎才是网站优化的"统治者",和谷歌优化相比,中国的SEO优化要复杂的多 ...

  2. 机器码call和jmp地址的计算

    call和jmp都是跳转指令,但是call的同时会把pc地址压入堆栈,并且这两种方式都有远和近跳转.下面的分析不全,因为没有在网上找到足够的资料,个人创造这个情景还是有些困难. 1.例子中的call的 ...

  3. .Net程序员必须要知道的东西之HttpModules与HttpHandlers介绍

    一.ASP.NET对请求处理的过程: 当客户端请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给ASPNET_ISAPI. ...

  4. CentOS的SSH,Putty配置说明

    基本资源: CentOS5.5 (32位) , Mysql6.0 ,Putty ,SSH   Step: 1.VMWare中装好CentOS    A. 可能存在ifconfig等命令无法正常识别) ...

  5. css的计数器

    更多关于计数器的问题可以参考:https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Getting_Started/Lists

  6. PHP函数preg_replace() 正则替换所有符合条件的字符串

    PHP preg_replace() 正则替换,与JavaScript 正则替换不同,PHP preg_replace() 默认就是替换所有符号匹配条件的元素. preg_replace (正则表达式 ...

  7. Mac os装软件时提示显示需要安装旧Java SE 6运行环境解决办法

    这个时Java版本的问题,换用合适的低版本即可,下面是官方的 https://support.apple.com/kb/DL1572?viewlocale=zh_CN&locale=en_US ...

  8. HDu1003(maxn sum)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABBcAAAMDCAYAAAD5XP0yAAAgAElEQVR4nOy97a8c133n2X+H3xjIC4

  9. BZOJ3083——遥远的国度

    1.题目大意:三个操作,换根,修改树上的某条路径,查询一个子树的最小值 2.分析:这个其实还是挺好做的,修改树上的某条路径,裸树剖,查询子树的最小值,这个是树剖满足dfs序 那么就是换根了,对吧,其实 ...

  10. BZOJ1146——[CTSC2008]网络管理Network

    1.题目大意:就是在动态的树上路径权值第k大. 2.分析:这个就是树链剖分+树套树 #include <cstdio> #include <cstdlib> #include ...