代码随想录算法训练营第51天| 图论 99.岛屿数量 深搜、 99.岛屿数量 广搜 、100.岛屿的最大面积

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

你可能感兴趣的:(算法,图论,深度优先)