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