能帮我解释一下么,函数DFS最后一个参数到底是什么意思呀?

参数类型是void么?是一个指针么?指针类型能是void么?

img

这是一个函数指针,你看下面调用 Visit(V); 就知道了。void 是这个函数指针的返回值类型。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7749762
  • 这篇博客你也可以参考下:(数据结构)有向图的拓扑排序 DFS实现
  • 除此之外, 这篇博客: DFS深度优先搜索---最短路径问题全攻略,图文解析与算法实例,让你快速掌握DFS算法这一搜索利器!中的 整体代码: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    #include<stdio.h>
    #include<stdlib.h>
    #include<windows.h>
    
    int book[51][51];       //检索坐标
    int a[51][51];          //通路与障碍坐标
    int maze[51][51];       //路径二维坐标 
    int n,m,p,q,min = 99999;//初始化最小值min 
    int path1[51],path2[51];//保存路径的x,y坐标 
    /*
    int a[51][51] = {
                      {0,0,1,0,1,0,0},
                      {1,0,0,0,0,1,0},
                      {0,0,1,1,0,0,0},
                      {1,0,0,1,1,1,0},
                      {0,0,0,0,0,0,0},
                      {1,1,0,0,1,0,1},
                      {1,0,0,0,0,0,1},
                      
    };*/
    
    /*创建移动方向*/ 
    
    int next[4][2] = {
                       {0,1},  //right
                       {1,0}, //up 
                       {0,-1}, //left
                       {-1,0} //down 
    };
    
    void dfs(int x ,int y,int step){  //DFS深度优先 
    	int tx,ty,k;                  //形参 
    	
    	if(x == q && y == p){        //出口,找到目标,登出 
    		
    		if(step < min){          //更新最短路径 
    		min = step;
    		
    		for(int i = 0; i < step; i++)printf("(%d,%d)",path1[i],path2[i]);  //打印一维路径 
    		
    		for(int i = 0; i < n; i++){     //清除maze缓存 
         	for(int j = 0; j < m; j++){
         		maze[i][j] = 0;
    		 }
    	 }
    		
    		for(int i = 0; i < step; i++){  //由两个一维数组可构建一个二维数组 
               maze[path1[i]][path2[i]] = 5;  //赋值5代表路径 
    		}
    		
    		printf("path = %d\n",min);     //打印最小值 
    		
    		printf("\n");
    
    		}
    		return ; //此时的return代表返回上一步 
    		
    	}
    	
    	for(k = 0; k <= 3; k++){ //移动方向, 
    		tx = x + next[k][0]; //当前x加即将移动方向 
    		ty = y + next[k][1]; //当前y加即将移动方向 
    		
    		   if(tx < 1 || tx > n || ty < 1 || ty > m) //是否越界,越界跳出循环 
    		   continue;
    		   
    		   if(a[tx][ty] == 0 && book[tx][ty] == 0){ //a代表障碍,0表示无,book代表是否检索过,0代表未 
    		   	book[tx][ty] = 1; //表示该坐标已检索 
    		   	path1[step] = tx; //缓存x 
    		   	path2[step] = ty; //缓存y 
    		   	
    		   	dfs(tx,ty,step+1);//进入下一步DFS 
    		   	/*以下是回溯,这里代表return后的步骤,即回溯*/ 
    		   	
    		   	book[tx][ty] = 0; //已经回溯,还原该坐标,代表未检索 
    		   }
    	}
    	return ; 
    }
    
    int main(){
         
         int i,j,startx,starty;
         printf("矩阵大小:");
         scanf("%d %d",&n,&m);
         printf("起始位置:");
    	 scanf("%d %d",&startx,&starty);
    	 printf("目标位置:");
    	 scanf("%d %d",&q,&p);
    	 
    	 book[startx][starty] = 1;//标记起始位置为已检索,在路径中不会显示起始位置,注释,即可显示 
    	 
    	      for(i = 0; i < n; i++){ //初始化 
         	for(j = 0; j < m; j++){
         		a[i][j] = 0;
                a[rand()%7][rand()%7] = 1;//随机生成墙 
    		 }
    	 }
    	 for(i = 0; i < n; i++){ //初始化 
         	for(j = 0; j < m; j++){
         		maze[i][j] = 0;
         		if((i == startx) && (j == starty))a[i][j] = 0;
                if((i == q) && (j == p))a[i][j] = 0;
    		 }
    	 }
    	 
    	 dfs(startx,starty,0); //DFS深度优先开始,从起始位置,步数0开始 
    
    	for(int heng = 0; heng < n; heng++){   //打印二维路径 
    	 	for(int shu = 0; shu < m; shu++){
    	 		if(a[heng][shu] == 1) maze[heng][shu] = 1;
    	 		printf("%d",maze[heng][shu]);
    		 }printf("\n");
    	 }printf("\n");
    	 
    	 return 0;
         
    }
    
  • 您还可以看一下 陈小玉老师的搜索算法精讲+刷题实战课程中的 深度优先搜索DFS小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    函数DFS的最后一个参数是指针类型,它是一个回调函数,用于遍历时访问每个被遍历的节点。该回调函数的类型可以是任意类型,包括void类型。因为回调函数的类型由实际情况决定,因此它可以是任意类型。通常,回调函数会在每个节点被访问时执行。该函数的参数包括图的顶点和遍历状态。回调函数可以根据自己的需要访问顶点和状态。在实现回调函数时,可以考虑使用函数指针或lambda表达式。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^