99.岛屿数量 深搜
深搜DFS:深搜的模板长得和回溯很像。深搜三部曲:1.确定深搜函数参数,2.确认终止条件,3.处理目前搜索节点出发的路径。除此之外,在做深搜题时涉及到了需要自己定义图的过程。由于习惯了力扣,这次忽然需要自己定义还是比较吃力的,一共有两种方法,一个是邻接矩阵,一个是邻接表。邻接矩阵就是二维数组,邻接表是一维数组和链表的结合,就是存储链表的一维数组。在定义好了邻接矩阵或者邻接表之后,就可以正常遍历输入路径了。然后正常进行深搜,写好终止条件和本环节处理条件以及回溯,就可以了。
代码:
#include<iostream>
using namespace std;
#include<vector>
//深搜
//深搜三部曲 确认深搜函数参数 确认终止条件 处理目前结点出发的路径
int number=0;//岛屿数量
void dfs(vector<vector<int>> &graph,int a, int b);
int main(){
//首先建表
int n, m, insert;
cin>>n>>m;
vector<vector<int>> graph(n,vector<int>(m,0));
//为图赋值
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>insert;
graph[i][j]=insert;
}
}
int number=0;
//访问过的位置改为0
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(graph[i][j]==1){
number++;
dfs(graph,i,j);
}
}
}
cout << number;
return 0;
}
//计算岛屿数量 深搜
void dfs(vector<vector<int>> &graph,int a, int b){
if(graph[a][b]==0) return;
//如果四周都为0 则为岛屿 (即所求位置超出范围或者值为0)
//vector<int> cur(4,0);//代表左上右下
int row = graph[0].size();//行数
int column =graph.size();//列数
graph[a][b]=0;
if(b-1>=0) dfs(graph,a,b-1);
if(a-1>=0) dfs(graph,a-1,b);
if(b+1<row) dfs(graph,a,b+1);
if(a+1<column) dfs(graph,a+1,b);
}
99.岛屿数量 广搜
广搜BFS:至于广搜,相比于深搜一条路跑到黑的过程,广搜是一圈一圈搜的。广搜是从起点出发,一圈一圈进行搜索,遇到终点时,所记录的路径长度就是最短路径。但是在做岛屿问题时,要对遍历完的坐标做标记,比如说true和false。我采用了将原来标记的1改为0的方法,两者思路相同。实现广搜一般使用的容器有数组,栈,队列。最常用的是队列。
代码:
#include<iostream>
using namespace std;
#include<vector>
#include<queue>
void bfs(vector<vector<int>> &graph,int a, int b);
int main(){
//首先建表
int n, m, insert;
cin>>n>>m;
vector<vector<int>> graph(n,vector<int>(m,0));
//为图赋值
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>insert;
graph[i][j]=insert;
}
}
int number=0;
//访问过的位置改为0
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(graph[i][j]==1){
number++;
bfs(graph,i,j);
}
}
}
cout << number;
return 0;
}
//计算岛屿数量 广搜
void bfs(vector<vector<int>> &graph,int a, int b){
queue<pair<int,int>> que;//队列里面存的是坐标
que.push({a,b});
int row = graph[0].size();//行数
int column =graph.size();//列数
while(!que.empty()){
pair<int,int> location = que.front();
a=location.first;
b=location.second;
graph[a][b]=0;
que.pop();
//上下左右存入队列
if(b-1>=0) dfs(graph,a,b-1);
if(a-1>=0) dfs(graph,a-1,b);
if(b+1<row) dfs(graph,a,b+1);
if(a+1<column) dfs(graph,a+1,b);
}
}
100.岛屿的最大面积
思路:一开始把深搜的终止条件写在for循环里面了 卡了很久。
代码:
#include<iostream>
using namespace std;
#include<vector>
//深搜
vector<vector<int>> mov={{0,-1,1,0},{-1,0,0,1}};
void dfs(vector<vector<bool>> &visited,vector<vector<int>> &graph, int a, int b,int &res){
//左上下右
if(visited[a][b]==false&&graph[a][b]==1){
visited[a][b]=true;
res++;
for(int k=0;k<4;k++){
int cur_row = a + mov[0][k];
int cur_col = b + mov[1][k];
int i=graph[0].size();
int j=graph.size();
if(cur_row<0||cur_row>=j||cur_col<0||cur_col>=i)continue;
dfs(visited,graph,cur_row,cur_col,res);
}
}
}
int main(){
int n,m;
cin>>n>>m;
vector<vector<int>> graph(n,(vector<int>(m,0)));
vector<vector<bool>> visited(n,(vector<bool>(m,false)));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>graph[i][j];
}
}
int MAX=0;
int res=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(!visited[i][j]&&graph[i][j]==1){
res=0;
dfs(visited,graph,i,j,res);
MAX=max(MAX,res);
}
}
}
cout<<MAX;
}