java算法--迷宫问题dfs+回溯打印出每条路的完整路径

迷宫问题之前是学习求解路径的数量或者最短路径的步数,这些都是找到目标点即可return。

-------

想要到达终点时对这条路径打印出来,则要用到回溯算法,每一次搜索则记录每一步的位置,在到达终点时遍历出记录下来的位置数组。

-------

本小白用的方法是建立一个sum二维数组,第一列放置每个点的x坐标,第二列放置每个点的y坐标。

    static int sum[][] =new int [50000][2]; // 回溯要用到的函数,记录路径

每一次深度遍历判断后,则对sum数组进行标记,k是记录步数的,每次标记后就k++,方便下个标记。注意后面需要k–刷新新的路径。

    	for(int i=0;i<4;i++) {
    		int tx = x + dx[i];
    		int ty = y + dy[i];
    		if(a[tx][ty]==1 && v[tx][ty]==0) {
    			v[tx][ty]=1;
    			sum[k][0]=x;     //记录点的x坐标
    			sum[k][1]=y;    //记录点的y坐标
    			k++;            //准备记录下个点的坐标
    			dfs(tx,ty);
    			v[tx][ty]=0;
    			k--;            //退回上一个点的坐标记录
    		}
    	}

完整代码如下:
本题是洛谷P1238的解题代码

package luogu;

import java.util.Scanner;

public class P1238 {
	static int a[][] = new int [50][50];
	static int v[][] = new int [50][50];
    static int m,n,SX,SY,FX,FY;     //迷宫大小,起始目标地址
    static int dx[] = {0,-1,0,1};
    static int dy[] = {-1,0,1,0};
    static int sum[][] =new int [50000][2]; // 回溯要用到的函数,记录路径
                                            // 第一列记录每个点的x坐标,第二列记录每个点的y坐标
    static int num;
    static int k;    //记录走的步数,方便回溯打印
    public static void print() {
    	for(int i =0;i<=k-1;i++)    //对经过的每个点的坐标打印出来
    		System.out.print("("+sum[i][0]+","+sum[i][1]+")"+"->");
    		System.out.println("("+FX+","+FY+")");
    	
    }
    
    public static void dfs(int x,int y) {
    	if(x==FX&&y==FY) {
    		num++;
    		print();    //如果到达则回溯打印经过的每个点
    		return;
    	}
    	
    	for(int i=0;i<4;i++) {
    		int tx = x + dx[i];
    		int ty = y + dy[i];
    		if(a[tx][ty]==1 && v[tx][ty]==0) {
    			v[tx][ty]=1;
    			sum[k][0]=x;     //记录点的x坐标
    			sum[k][1]=y;    //记录点的y坐标
    			k++;            //准备记录下个点的坐标
    			dfs(tx,ty);
    			v[tx][ty]=0;
    			k--;            //退回上一个点的坐标记录
    		}
    	}
}
    public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		m =in.nextInt();
		n =in.nextInt();
		
		
		for(int i=1;i<=m;i++)
			for(int j =1;j<=n;j++)
				a[i][j]=in.nextInt();
		SX = in.nextInt();
		SY = in.nextInt();
		FX = in.nextInt();
		FY = in.nextInt();
		
		dfs(SX,SY);
		if(num==0)System.out.println(-1);
}

}

已标记关键词 清除标记
<p> <span>做一门精致,全面详细的 java数据结构与算法!!!</span> </p> <p> <span>让天下没有难学的数据结构,</span> </p> <p> <span>让天下没有难学的算法,</span> </p> <p> <span>不吹不黑,我们的讲师及其敬业,可以看到课程视频,课件,代码的录制撰写,都是在深夜,如此用心,其心可鉴,他不掉头发,谁掉头发???</span> </p> <p> <span>总之你知道的,不知道的,我们都讲,并且持续更新,走过路过,不要错过,不敢说是史上最全的课程,怕违反广告法,总而言之,言而总之,这门课你值得拥有,好吃不贵,对于你知识的渴求,我们管够管饱</span> </p> <p> 话不多说,牛不多吹,我们要讲的本门课程内容: </p> <p> <span style="color:#404040;">稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯迷宫问题、八皇后问题算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。</span> </p>
相关推荐
<span style="color:#404040;">1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构和算法支撑。</span><br /><br /><span style="color:#404040;">2.网上数据结构和算法的课程不少,但存在两个问题:</span><br /><br /><span style="color:#404040;">1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了</span><br /><span style="color:#404040;">2)说是讲数据结构和算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 </span><br /><span style="color:#404040;">3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 </span><br /><span style="color:#404040;">4)系统全面的讲解了数据结构和算法, 除常用数据结构和算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生的面试题,让你秒杀其他面试小伙伴</span><br /><br /><span style="color:#404040;">3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构和算法。</span><br /><br /><span style="color:#404040;">教程内容:</span><br /><span style="color:#404040;">本教程是使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯迷宫问题、八皇后问题算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。</span><br /><br /><span style="color:#404040;">学习目标:</span><br /><span style="color:#404040;">通过学习,学员能掌握主流数据结构和算法的实现机制,开阔编程思路,提高优化程序的能力。</span>
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页