【leetcode】Surrounded Regions(middle)☆
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)☆的更多相关文章
- 【leetcode】Reverse Integer(middle)☆
Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 总结:处理整数溢出 ...
- 【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 ...
- 【leetcode】Word Break (middle)
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...
- 【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 ...
- 【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 ...
- 【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 ...
- 【leetcode】Rotate Image(middle)
You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...
- 【leetcode】Next Permutation(middle)
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- 【leetcode】Reverse Bits(middle)
Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...
随机推荐
- 【AngularJS】—— 3 我的第一个AngularJS小程序
通过前面两篇的学习,基本上对AngularJS的使用有了一定的了解. 本篇将会自己手动写一个小程序,巩固下理解. 首先要注意的是,引用AngularJS的资源文件angular.min.js文件. 由 ...
- 【Junit】JUnit-4.12使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
下载了最新的JUnit版本,是4.12,结果尝试使用发现总是报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing这样的错误, 上网查 ...
- nyoj 364 田忌赛马(贪心)
田忌赛马 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Here is a famous story in Chinese history. "That ...
- nyoj 236心急的C小加 动态规划( java)
sort函数用法: #include<algorithm> using namespace std; sort(a,a+len;cmp) //a-->数组名, len-- ...
- jstl c标签
判断List是否为空的一种方法是使用jstl的c标签. <c:if test="${not empty cpInfo.cpCredentials}"> </c:i ...
- java执行顺序
本文讨论Java中(静态)变量.(静态)代码块的执行顺序 首先创建3个类: 1.Foo类,用于打印变量 public class Foo { public Foo(String word) { Sys ...
- 第五天 loadmore
mutating func loadFresh(completion: (result: APIResult<DeserializedType>) -> ()) -> Canc ...
- python 深入模块和包
模块可以包含可执行语句以及函数的定义. 这些语句通常用于初始化模块. 它们只在 第一次 导入时执行.只在第一次导入的时候执行,第一次.妈蛋的第一次...后面再次导入就不执行了. [1](如果文件以脚本 ...
- [codevs1154][COJ0177][NOIP2006]能量项链
[codevs1154][COJ0177][NOIP2006]能量项链 试题描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这 ...
- Sqli-LABS通关笔录-6
第六关跟第五关一样的是布尔型盲注技术. 只是在部分有出路 添加一个单引号.程序无反应.双引号和斜杠可使其报错. 这一关让我学到了 1.管他三七二十七报错看看语句再说. THE END