解决迷宫路径问题(深度优先)JAVA

 已知一个N*N的迷宫,允许上,左,下,右四个方向行走,且迷宫中没有任何障碍,所有点都可以走。现在请你按照上,左,下,右顺序进行搜索,找出从(0,0)点到(N-1,N-1)点的所有路径。

输入格式:输入一个整数N(0<N<=5)代表迷宫的大小。

输出格式:按上,左,下,右搜索顺序探索迷宫,输出从点(0,0)走到右下角(N-1,N-1)点的所有可能的路径。

样例输入:

3

样例输出:

(0,0)->(0,1)->(0,2)->(1,2)->(1,1)->(1,0)->(2,0)->(2,1)->(2,2)
(0,0)->(0,1)->(0,2)->(1,2)->(1,1)->(2,1)->(2,2)
(0,0)->(0,1)->(0,2)->(1,2)->(2,2)
(0,0)->(0,1)->(1,1)->(1,0)->(2,0)->(2,1)->(2,2)
(0,0)->(0,1)->(1,1)->(1,2)->(2,2)
(0,0)->(0,1)->(1,1)->(2,1)->(2,2)
(0,0)->(1,0)->(1,1)->(0,1)->(0,2)->(1,2)->(2,2)
(0,0)->(1,0)->(1,1)->(1,2)->(2,2)
(0,0)->(1,0)->(1,1)->(2,1)->(2,2)
(0,0)->(1,0)->(2,0)->(2,1)->(1,1)->(0,1)->(0,2)->(1,2)->(2,2)
(0,0)->(1,0)->(2,0)->(2,1)->(1,1)->(1,2)->(2,2)
(0,0)->(1,0)->(2,0)->(2,1)->(2,2)

解题思路:对路径深度优先遍历,回溯。

import java.util.*;
public class Main{
public static void main(String[] args){
   Scanner sc=new Scanner(System.in);
   int n=sc.nextInt();
   Maze s=new Maze(n);
   s.b[0][0]=true;//标记此点已经走过
   s.dfs(0, 0, 0);
}
}
class Maze
{
 boolean b[][];//标记是否走过
 int c[][];//储存路径
 int fx[];
 int fy[];//遍历顺序
 int N;
 Maze(int n)
 {
 this.N=n-1;
 b=new boolean[n][n];
 c=new int [n*n][3];
 int xx[]= {0,-1,0,1};
 int yy[]= {-1,0,1,0};//上左下右
 fx=xx;
 fy=yy;
 }
 public void dfs(int x,int y,int k)
 {
	 c[k][1]=x;
	 c[k][2]=y;
	 //先存入此点
	 if(x==N&&y==N)
	 {
		 print(k);
	 }
	 int tx=0,ty=0;
	 for(int i=0;i<4;i++)
	 {
		tx=x+fx[i];
		ty=y+fy[i];//上左下右遍历
		if(tx>=0&&tx<=N&&ty>=0&&ty<=N&&b[tx][ty]!=true)
		{
			b[tx][ty]=true;//标记走过
			dfs(tx,ty,k+1);
			b[tx][ty]=false;//回溯到前一个状态
		}
	 }
 }
 public void print(int k)
 {
   for(int i=0;i<k;i++)
   System.out.print("("+c[i][1]+","+c[i][2]+")"+"->");
   System.out.println("("+c[k][1]+","+c[k][2]+")");
 }
}

思路来源于B站视频博主(虽然是c++,但是思路非常清晰): https://www.bilibili.com/video/BV1kU4y1h77M?vd_source=d9567d37d14646768923e49ef06e890d 

(解决迷宫问题我之前一直觉得是那么触不可及,但当我真正静下来尝试去慢慢弄清楚它的时候又恰似“山重水复疑无路,柳暗花明又一村。”,很多时候并不是山太高大我就无法攀爬,而是我没有去找上山的路。) 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值