[LeetCode] BFS解决的题目
一.130 Surrounded Regions(https://leetcode.com/problems/surrounded-regions/description/)
题目:

解法:
这道题的意思是将所有被X包围的O都变为X(边缘的不算),我们可以维护一个队列,先把四周的O的位置放进队列中,并把这个位置的值变为Y。然后每次从队列中拿出一个位置,把这个位置四周为O的位置的值变为Y,再把这个位置放进队列(为什么要先变值再进队列呢?在下一道题中会说)。一直到队列为空时,我们就成功地把所有直接或间接地与边缘的O相连的其他O变为了Y,剩余的O就是被X包围的了。然后遍历一遍,把为O的位置变为X,为Y的位置变为O,就得出结果了。
这道题利用到了BFS(宽度优先搜索)的思想,那么用深度优先是否可以呢?据说会TLE,因为图可能很大,递归会导致栈溢出。但是,我认为分别用这两种不同的方法思考一下这道题,可以锻炼利用bfs和dfs解题的思想。
下面是代码:
class Solution {
public:
void solve(vector<vector<char>>& board) {
queue<int> x;
queue<int> y;
for (int i = ; i < board.size(); i++) {
for (int j = ; j < board[i].size(); j++) {
if ((i == || i == board.size() - ||
j == || j == board[i].size() - ) &&
board[i][j] == 'O') {
x.push(i);
y.push(j);
board[i][j] = 'Y';
}
}
}
while (!x.empty() && !y.empty()) {
int i = x.front();
int j = y.front();
x.pop();
y.pop();
if (i - >= && board[i - ][j] == 'O') {
x.push(i - );
y.push(j);
board[i - ][j] = 'Y';
}
if (i + < board.size() && board[i + ][j] == 'O') {
x.push(i + );
y.push(j);
board[i + ][j] = 'Y';
}
if (j - >= && board[i][j - ] == 'O') {
x.push(i);
y.push(j - );
board[i][j - ] = 'Y';
}
if (j + < board[].size() && board[i][j + ] == 'O') {
x.push(i);
y.push(j + );
board[i][j + ] = 'Y';
}
}
for (int i = ; i < board.size(); i++) {
for (int j = ; j < board[i].size(); j++) {
if (board[i][j] == 'Y') {
board[i][j] = 'O';
}
else {
board[i][j] = 'X';
}
}
}
}
};
二. 200 Number of Islands(https://leetcode.com/problems/number-of-islands/description/)
题目:

解法:
这道题的基本思想跟上面一道差不多,也是用bfs,维护一个队列:
当遇到1的时候,把它改为0,进队列;(每次遇到新的island时)
每次把一个位置出队列,并把这个位置四周为1的位置改为0,然后把这些位置放入队列中。当队列为空时,代表已经找到一个island的所有1了,结果+1。
解法是简单的,但我做题的时候还是踩了不少坑:
(1)我用了三层循环去写,因为我想着要判断什么时候所有位置都为0,但其实是多此一举,只需要遍历每一个位置就行了。
(2)我一开始是先把位置放进队列,在出队列的时候才把这个位置的值变为0,但这是不对的:这样会造成一个位置的多次进队列(细想一下吧,出队列的时候才变为0,那在进队列到出队列的过程中这个位置的值还是1,还是会被其他位置检测到,多次加进队列),肯定会TLE。因此一定要先把值变为0,再加进队列。
代码如下:
class Solution {
public:
int numIslands(vector<vector<char> >& grid) {
int ans = ;
queue<int> x, y;
for (int i = ; i < grid.size(); i++ ) {
for (int j = ; j < grid[].size(); j++) {
if (grid[i][j] == '') {
x.push(i);
y.push(j);
grid[i][j] = '';
while (!x.empty() && !y.empty()) {
int i = x.front();
int j = y.front();
x.pop();
y.pop();
if (i - >= && grid[i - ][j] == '') {
x.push(i - );
y.push(j);
grid[i - ][j] = '';
}
if (i + < grid.size() && grid[i + ][j] == '') {
x.push(i + );
y.push(j);
grid[i + ][j] = '';
}
if (j - >= && grid[i][j - ] == '') {
x.push(i);
y.push(j - );
grid[i][j - ] = '';
}
if (j + < grid[].size() && grid[i][j + ] == '') {
x.push(i);
y.push(j + );
grid[i][j + ] = '';
}
}
ans++;
}
}
}
return ans;
}
};
或者:
class Solution {
public:
int numIslands(vector<vector<char> >& grid) {
int ans = ;
for (int i = ; i < grid.size(); i++ ) {
for (int j = ; j < grid[].size(); j++) {
if (grid[i][j] == '') {
bfs(grid, i, j);
ans++;
}
}
}
return ans;
}
void bfs(vector<vector<char> >& grid, int i, int j) {
grid[i][j] = '';
if (i - >= && grid[i - ][j] == '') {
bfs(grid, i - , j);
}
if (i + < grid.size() && grid[i + ][j] == '') {
bfs(grid, i + , j);
}
if (j - >= && grid[i][j - ] == '') {
bfs(grid, i, j - );
}
if (j + < grid[].size() && grid[i][j + ] == '') {
bfs(grid, i, j + );
}
}
};
三.542 01 Matrix
题目:

解法:

代码:
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
vector<vector<int> > ans = matrix;
queue<int> x, y;
for (int i = ; i < ans.size(); i++) {
for (int j = ; j < ans[].size(); j++) {
if (matrix[i][j] == ) {
ans[i][j] = ;
x.push(i);
y.push(j);
}
else {
ans[i][j] = -;
}
}
}
while (!x.empty() && !y.empty()) {
int i = x.front(), j = y.front();
x.pop();
y.pop();
if (i - >= && ans[i - ][j] == -) {
ans[i - ][j] = ans[i][j] + ;
x.push(i - );
y.push(j);
}
if (i + < ans.size() && ans[i + ][j] == -) {
ans[i + ][j] = ans[i][j] + ;
x.push(i + );
y.push(j);
}
if (j - >= && ans[i][j - ] == -) {
ans[i][j - ] = ans[i][j] + ;
x.push(i);
y.push(j - );
}
if (j + < ans[].size() && ans[i][j + ] == -) {
ans[i][j + ] = ans[i][j] + ;
x.push(i);
y.push(j + );
}
}
return ans;
}
};
2018.1.7补充:
上面这一题,重做了一下,想到一个问题: 为什么可以不判断一下就直接ans[i][j] + 1呢?
题目要求离最近的0的距离,而BFS是一层层叠加的、从小到大的,在if处加了ans[i + 1][j] == -1的判断,说明要已修改的值是不能再修改的,满足离最近的0的距离的要求。(描述得不是很清楚,不过自己能回想起就对了)
LeetCode上面还有其他一些用BFS解决的问题,比如Word Ladder,但在前面已经写过了。
[LeetCode] BFS解决的题目的更多相关文章
- 有关dfs、bfs解决迷宫问题的个人见解
可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是 ...
- BFS广搜题目(转载)
BFS广搜题目有时间一个个做下来 2009-12-29 15:09 1574人阅读 评论(1) 收藏 举报 图形graphc优化存储游戏 有时间要去做做这些题目,所以从他人空间copy过来了,谢谢那位 ...
- BFS解决九宫重排问题
问题 1426: [蓝桥杯][历届试题]九宫重排 时间限制: 1Sec 内存限制: 128MB 提交: 215 解决: 47 题目描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个 ...
- LeetCode All in One 题目讲解汇总(转...)
终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通 ...
- leetcode-78-子集(用bfs解决)
题目描述: 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3], [1] ...
- 利用BFS解决拯救007问题 -- 数据结构
题目: 7-1 拯救007 (30 分) 在老电影“007之生死关头”(Live and Let Die)中有一个情节,007被毒贩抓到一个鳄鱼池中心的小岛上,他用了一种极为大胆的方法逃脱 —— 直接 ...
- LeetCode All in One 题目讲解汇总(持续更新中...)
终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 477 Total Hamming Distance ...
- [LeetCode] 链表反转相关题目
暂时接触到LeetCode上与链表反转相关的题目一共有3道,在这篇博文里面总结一下.首先要讲一下我一开始思考的误区:链表的反转,不是改变节点的位置,而是改变每一个节点next指针的指向. 下面直接看看 ...
- leetcode BFS解题思路
Word Ladder 思路一:单向bfs, 使用visited数组记录哪些已经访问过了, 访问过的就不允许再次入队, 同时这里想到的是使用26个英文字母,枚举可能的取值, 类似brute force ...
随机推荐
- http://codeforces.com/contest/349
A. Cinema Line time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- Linux下Apache https认证
参考:http://kyfxbl.iteye.com/blog/1910891 http://showerlee.blog.51cto.com/2047005/1266712 一.环境 httpd:A ...
- Python学习手册 :Python 学习笔记第一天
获取当前目录路径: import os os.getcwd() 在输入python程序时,尽量让不是嵌套结构的语句处于最左侧,要不然系统或许会出现"SyntaxError"错误 获 ...
- WinForm 读写配置文件
//读配置文件 方法(1) //ConfigurationManager.RefreshSection("appSettings"); //强制重新载入 string settin ...
- 如何结合场景利用block进行回调
我们在开发中常常会用到函数回调,你可以用通知来替代回调,但是大多数时候回调是比通知方便的,所以何乐而不为呢?如果你不知道回调使用的场景,我们来假设一下: 1.我现在玩手机 2.突然手机没有电了 3.我 ...
- Iframe父子窗口之间的跨域事件调用和传值
实现方案1:location.hash传值 父页面:parent.html(所在域:www.parent.com) 子页面:child.html(所在域:www.child.com) 要实现父子页面双 ...
- JMS 基础
1. JMS基本概念 JMS(Java Message Service) 即Java消息服务.它提供标准的产生.发送.接收消息的接口简化企业应用的开发. 它支持两种消息通信模型:点到点(point-t ...
- mysql的读写分离
1.laravel实现数据库读写分离配置或者多读写分离配置 config\database.php里配置 'connections' => array( //默认mysql配置,访问t ...
- VS连接数据库的通用方法(SQL/MySql)
在vs里面连接数据库的方法有很多,这里是通用的方法和基本操作 SQL /// <summary> /// 数据访问抽象基础类 /// Copyright (C) Maticsoft /// ...
- Mapper 动态代理方式
Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法. Mapper接口开发 ...