题目
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’是可以从外界走通的,保留
如果是’O’,说明这是闭塞的,从外界走不通的,替换为’X’。
代码
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
class Solution {
public:
void solve(vector<vector<char> > &board) {
int row = board.size();
if(row == 0){
return;
}
int col = board[0].size();
if(row <= 2 || col <= 2){
return;
}
for(int i = 0;i < col;++i){
BFS(board,row,col,0,i);
BFS(board,row,col,row-1,i);
}
for(int j = 0;j < row;++j){
BFS(board,row,col,j,0);
BFS(board,row,col,j,col-1);
}
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';
}
}
}
}
private:
void BFS(vector<vector<char>> &board,int row,int col,int x,int y){
queue<pair<int,int> > q;
Pass(board,row,col,x,y,q);
while(!q.empty()){
pair<int,int> point = q.front();
q.pop();
x = point.first;
y = point.second;
Pass(board,row,col,x,y+1,q);
Pass(board,row,col,x,y-1,q);
Pass(board,row,col,x-1,y,q);
Pass(board,row,col,x+1,y,q);
}
}
void Pass(vector<vector<char>> &board,int row,int col,int x,int y,queue<pair<int,int> > &q){
if(x < 0 || x >= row || y < 0 || y >= col || board[x][y] != 'O'){
return;
}
board[x][y] = '.';
q.push(make_pair(x,y));
}
};
int main(){
Solution s;
vector<vector<char> > board = {
{'X','X','X'},
{'X','O','X'},
{'X','X','X'}
};
s.solve(board);
for(int i = 0;i < board.size();i++){
for(int j = 0;j < board[i].size();j++){
cout<<board[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
运行时间
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
分享到:
相关推荐
用C语言实现Leetcode题目.zip用C语言实现Leetcode题目.zip用C语言实现Leetcode题目.zip用C语言实现Leetcode题目.zip用C语言实现Leetcode题目.zip用C语言实现Leetcode题目.zip用C语言实现Leetcode题目.zip用C语言实现...
JVM 基础 JAVA 并发 JVM 性能调优 LeetCode 算法 .......
My Solutions to Leetcode Database problems. 我的 Leetcode 数据.zip
Leetcode 题解.pdf
LeetCode 后端.zip
LeetCode 101_C++_算法_leetcode_leetcode101_leetcode101.zip
Recording personal Java, Python, JavaScript solutions for Leetcode problems. 记录个人 Java, Python, JavaScript 的Leetcode题解.zip
Leetcode101.zip
刷leetcode总结.md
原创:leetcode 111. 二叉树的最小深度记住:最小深度和最大深度方法不同。* Definition for a binary tree node.in
原创:leetcode 107. 二叉树的层次遍历 II【队列】* Definition for a binary tree node.
原创:leetcode 5. 最长回文子串//寻找以i-1,i为中点偶数长度的回文//寻找以i为中心的奇数长度的回文。
原创:leetcode 22.括号生成【回溯】对待这种问题,千万别暴力搜索,那样太笨了。但是这个方法是最容易理解的//回溯法 (后面的括号) 不可以大于 (前面
My Solutions to Leetcode problems. All solutions support C
LeetCode674. 最长连续递增序列674. 最长连续递增序列解题思路:记录每次递增序列的长度,max存储最大长度// 递增序列更新最大长度} else
LeetCode746.使用最小花费爬楼梯746. 使用最小花费爬楼梯解题思路:动态规划当前楼梯最小值=Math.min(前一步最小值,前两步最小值)简化 mi
LeetCode888. 公平的糖果棒交换888. 公平的糖果棒交换解题思路:哈希表法第一次遍历 A\B 计算二者的糖果差值 diff,同时以 B糖果值建立哈希
84. 柱状图中最大的矩形 - 力扣(LeetCode).html