当前位置:网站首页>934.最短的桥(广度优先搜索)
934.最短的桥(广度优先搜索)
2022-07-30 05:38:00 【Linke66】
解题思路
方法1:暴力法
使用深度优先搜索,讲两个岛屿的坐标存储到两个数组中,然后用两个for遍历数组,找到最小置。
很暴力,时间和空间复杂度也很高。
class Solution {
public:
int shortestBridge(vector<vector<int>>& grid) {
int m=grid.size(),n=grid[0].size();
vector<vector<bool>>visited(m,vector<bool>(n,false));
vector<vector<int>>island1_axis,island2_axis;
int whichIsland=1;
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
if(!visited[i][j]&&grid[i][j]==1){
if(whichIsland==1){
++whichIsland;
dfs(grid,visited,island1_axis,i,j);
continue;
}
if(whichIsland==2){
++whichIsland;
dfs(grid,visited,island2_axis,i,j);
}
}
}
}
int min_cnt=INT_MAX;
int cnt;
for(auto &axis1:island1_axis){
int x1=axis1[0],y1=axis1[1];
for(auto &axis2:island2_axis){
int x2=axis2[0],y2=axis2[1];
cnt=abs(x1-x2)+abs(y1-y2)-1;
if(cnt<min_cnt) min_cnt=cnt;
}
}
return min_cnt;
}
void dfs(const vector<vector<int>> &grid,vector<vector<bool>> &visited,
vector<vector<int>> &axis,int x,int y)
{
if(x>=0&&x<grid.size()&&y>=0&&y<grid[0].size()
&&!visited[x][y]&&grid[x][y]==1){
visited[x][y]=true;
axis.push_back({
x,y});
dfs(grid,visited,axis,x-1,y);
dfs(grid,visited,axis,x+1,y);
dfs(grid,visited,axis,x,y-1);
dfs(grid,visited,axis,x,y+1);
}
}
};
法2:广度优先搜索
处理最短路径问题,使用广度优先搜索方法。
这个方法是看答案的,感觉很巧妙,以前没有想过这种方法,在此记录一下。
先通过深度优先搜索其中一个岛屿,并且将数字变为2,与另一座岛屿区分;然后再通过广度优先搜索,一层一层架桥,直到遇到另一座岛。
class Solution {
vector<int>direction{
-1,0,1,0,-1};
public:
int shortestBridge(vector<vector<int>>& grid) {
int m=grid.size(),n=grid[0].size();
queue<pair<int,int>>points;
//dfs寻找第一个岛屿,并把1全部赋值为2
bool flipped=false;
for(int i=0;i<m;++i){
if(flipped) break;
for(int j=0;j<n;++j){
if(grid[i][j]==1){
dfs(points,grid,m,n,i,j);
flipped=true;
break;
}
}
}
//bfs寻找第二个岛屿,并把过程中经过的0赋值为2
int x,y;
int level=0;
while(!points.empty()){
//处理第一层0
++level;
int n_points=points.size();
while(n_points--){
//遍历第一层所有的点
auto [r,c]=points.front();
points.pop();
for(int k=0;k<4;++k){
x=r+direction[k],y=c+direction[k+1];
if(x>=0&&x<m&&y>=0&&y<n){
if(grid[x][y]==2){
//假如是2,啥也不做
continue;
}
if(grid[x][y]==1){
//假如遇到了另一座岛了,return level
return level;
}
if(grid[x][y]==0){
//假如遇到的还是0,那么就是下一层的0
points.push({
x,y});
//这个0变为2
grid[x][y]=2;
}
}
}
}
}
return 0;
}
//辅函数
void dfs(queue<pair<int,int>> &points,vector<vector<int>> &grid,
int m,int n,int i,int j)
{
if(i<0||j<0||i==m||j==n||grid[i][j]==2){
return;
}
if(grid[i][j]==0){
points.push({
i,j});
return;
}
grid[i][j]=2;
dfs(points,grid,m,n,i-1,j);
dfs(points,grid,m,n,i+1,j);
dfs(points,grid,m,n,i,j-1);
dfs(points,grid,m,n,i,j+1);
}
};
边栏推荐
- CISP-PTE真题演示
- Record Breaker (Google Kickstart2020 Round D Problem A)
- MySQL 有这一篇就够(呕心狂敲37k字,只为博君一点赞!!!)
- Different usage scenarios of subqueries as retrieval tables and the question of whether to add aliases
- cookie和session区别
- torch.load()
- mysql高阶语句(一)
- 微信小程序开发学习
- MySQL-Explain详解
- [GStreamer] The name of the plugin should match GST_PLUGIN_DEFINE
猜你喜欢
St. Regis Takeaway Project: New dishes and dishes paged query
[Other] DS5
[详解C语言]一文带你玩转数组
SOA(面向服务架构)是什么?
net start mysql MySQL 服务正在启动 . MySQL 服务无法启动。 服务没有报告任何错误。
navicat新建数据库
Memories · The last system design in the university era
MySQL stored procedure
It is enough for MySQL to have this article (37k words, just like Bojun!!!)
Teach you how to design a CSDN system
随机推荐
Navicat connection MySQL error: 1045 - Access denied for user 'root'@'localhost' (using password YES)
SRA数据下载方法总结
JVM之GC 调优基础知识(一)
MySql模糊查询大全
Solve phpstudy unable to start MySQL service
Different usage scenarios of subqueries as retrieval tables and the question of whether to add aliases
SOA(面向服务架构)是什么?
使用DataEase开源工具制作一个高质量的数据大屏
留念 · 大学时代最后的系统设计图
MySQL 数据库基础知识(系统化一篇入门)
Navicat new database
Basic syntax of MySQL DDL and DML and DQL
【线性神经网络】线性回归 / 基础优化方法
cmd (command line) to operate or connect to the mysql database, and to create databases and tables
从底层结构开始学习FPGA(6)----分布式RAM(DRAM,Distributed RAM)
CISP-PTE Zhenti Demonstration
手把手教你彻底卸载MySQL
It's time to have to learn English, give yourself multiple paths
list(列表)和array(数组)的区别
相对路径和绝对路径的区别