DFS(深度优先遍历)----最短路径

指导网址:https://blog.csdn.net/autfish/article/details/52447805

遇到纸条传递问题,刚开始觉得—我去,这不是就丫走两遍DFS的事儿么,后来才发现,会有堵死的情况,所以还得看人家四维数组的解题方式学习。

另外,更严重的是我丫走一遍都没走好—-因为把DFS和BFS搞混了,但是起码也比以前进步了不是—啊呸!

说重点的,就是本文中的方式改写成java后,明明逻辑都相同但是偏偏这不对那也不对,后来找到“罪魁祸首”—return 0;C和Java的void函数使用return 0还是有区别的,额,反正我目前是认为这个原因的。具体还得以后细琢磨。

然后呢,就看了上面指导博客里的小老鼠走迷宫,发现用到了栈来记录,所以呢,就是改了改,把单向传纸条完成了,其实也没改啥,主要就是输入输出条件改了改。不过经过那么多遍的修改,对DFS真的是很难印象不深刻呀。

之后还要多学习栈这方面的东西,毕竟肯定要经常用到。

好嘞,贴下代码:(代码是在原博基础上改的哈,网址见开头)

package 蓝桥;
import java.util.LinkedList;
import java.util.Scanner;
 
public class Maze {
    public static int endX;
    public static int endY;    
	public int max;
    public static int[][] a = new int[100][100];
    int[][] mark = new int[100][100];
    LinkedList<Integer> map = new LinkedList<>();
    public void dfs(int startX, int startY, int good) {
        int[][] next = new int[][] { //按右->下的顺序尝试
                {1, 0},
                {0, 1},
        };
        int nextX, nextY;
        int posible;
		if(startX == endX && startY == endY) {
            if(good>max)
                max = good;
            for(int i = map.size() - 1; i >= 0; i -= 2){
                nextX = map.get(i);
                nextY = map.get(i - 1);
                System.out.print("[" + nextX + "," + nextY + "]");
                if(i != 1)
                    System.out.print("->");
            }
            System.out.println();
            return;
        }
        for(posible = 0; posible < next.length; posible++) { //按右->下->左->上的顺序尝试
            nextX = startX + next[posible][0];
            nextY = startY + next[posible][1];            
            if(nextX < 1|| nextX >endX || nextY < 0 || nextY >endY) {  //超出边界
            	System.out.println(1);
                continue;
            }
            if(mark[nextX][nextY] == 0) {  //非障碍且未标记走过
                map.push(nextX);
                map.push(nextY);
                mark[nextX][nextY] = 1;
                dfs(nextX, nextY, good + a[nextX][nextY]);  //递归调用, 移动到下一格
                mark[nextX][nextY] = 0;
                map.pop();
                map.pop();
            }
        }
    }
 
    public static void main(String[] args) {
    	Scanner sc=new Scanner(System.in);
        int startX = 1;
        int startY = 1;
        int m=sc.nextInt();
        int n=sc.nextInt();
        for(int i=1;i<=n;i++) {
        	for(int j=1;j<=m;j++) {
        		a[i][j]=sc.nextInt();
        	}
        }
        Maze d = new Maze();
        d.endX=n;
        d.endY=m; 
        d.max=0;
        d.dfs(startX, startY, 0);
        System.out.println("最大好感度" + d.max);
       
    }
}

 

————————————————————————-更新线————————————————

自己根据看的内容写的,基本意思领会到已经会写,但是有时候界限值问题会搞得头大,浪费很多时间

不过经验就是先别急着写程序,现在脑子里或者纸上多写写

刚开始一下子去写有点儿懵,后来就先写了全排列,记住了大概意思

然后去吃饭的路上又想了想流程,下午起来再写时就相对来说比较顺畅了

问题是:将n,m设置为确切的边界值还是边界值-1时结果不同,可能是我其他的一些边界值没改吧,不过基本上完成了

明天再把广度优先遍历完成

#include<stdio.h>
int n,m;
int step=0,minstep=9999;
int b[100][100];
int a[100][100];
int startx,starty,endx,endy;
int next[4][2]={0,1,1,0,0,-1,-1,0};
int nx,ny;
void dfs(int x,int y,int step){
    int i,j;
    if(x==endx&&y==endy){
        if(step<minstep){
             minstep=step;

        }
        return;
    }
    for(i=0;i<4;i++){
        nx=x+next[i][0];
        ny=y+next[i][1];
        if(nx>n||ny>m||nx<1||ny<1||a[x][y]>0){
           continue;
        }
        if(b[nx][ny]==0){
                b[nx][ny]=1;
                dfs(nx,ny,step+1);
                b[nx][ny]=0;
        }

    }
    return;

}
int main(){
   int i,j;
   scanf(“%d %d”,&n,&m);
   printf(“请输入初始位置:”);
   scanf(“%d %d”,&startx,&starty);
   printf(“请输入目标位置:”);
   scanf(“%d %d”,&endx,&endy);
   printf(“请输入地图内容(0为空位置,1为有障碍物的地方):”);
   for(i=1;i<=n;i++){
     for(j=1;j<=m;j++){
        scanf(“%d”,&a[i][j]);
     }
   }
   b[startx][starty]=1;
   dfs(startx,starty,0);
   printf(“%d”,minstep);
   return 0;

}
 

 

 

 

    原文作者:DFS
    原文地址: https://blog.csdn.net/qq_40210633/article/details/82888500
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞