迷宫路径(纵情探索版)JAVA

 已知一个N*N的迷宫,允许上,左,下,右,左上,左下,右上,右下,八个方位任意探索,且迷宫中有障碍物(用1表示障碍物不能通过,0表示没有障碍物能通过),请找出迷宫中任意两点V1,V2之间的路径。

输入格式:

第一行是一个正整数N代表迷宫大小。

第二行是两个非负整数,中间以空格分开代表起始点V1的坐标。

第三行是两个非负整数,中间以空格分开代表终点V2的坐标。

接下来的N列N行由1和0构成的数组代表迷宫的地图。

输出格式:

输出可行路径的坐标,坐标之间用"->"链接,不同路径之间用换行隔开。

若没有路径请输出“没有路径”。

输入样例1:

3
0 0
2 2
0 1 1
1 1 0
1 1 0

输出样例1:

没有路径

 输入样例2:

3
0 0
2 2
0 0 1
1 1 0
1 1 0

输出样例2:

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

输出样例3:

7
0 0
6 6
0 1 1 1 1 1 1
1 0 1 1 0 1 1
0 1 1 1 0 1 1
0 1 0 1 0 1 1 
1 0 1 0 1 1 1
1 1 1 1 0 1 1 
0 0 1 1 0 0 0

输出样例3:

(0,0)->(1,1)->(2,0)->(3,0)->(4,1)->(3,2)->(4,3)->(5,4)->(6,4)->(6,5)->(6,6)
(0,0)->(1,1)->(2,0)->(3,0)->(4,1)->(3,2)->(4,3)->(5,4)->(6,5)->(6,6)

解题思路:深度优先遍历和回溯,是上次发布的解决迷宫路径问题的升级版,但核心依旧不变。

解决迷宫路径问题:http://t.csdn.cn/nqcs8

本题代码如下:

import java.util.*;
public class Main{
public static void main(String[] args){
   Scanner sc=new Scanner(System.in);
   int n=sc.nextInt();
   int xy=0;
   Maze s=new Maze(n);
   int x=sc.nextInt();
   int y=sc.nextInt();
   int xx=sc.nextInt();
   int yy=sc.nextInt();
   s.over(xx, yy);
   for(int i=0;i<n;i++)
   for(int j=0;j<n;j++)
   {
	  xy=sc.nextInt();
	  if(xy==1)
	  s.b[i][j]=true;
   }
   s.b[x][y]=true;//标记此点已经走过
   s.dfs(x, y, 0);
   s.print1();
}
}
class Maze
{
 boolean b[][];//标记是否走过
 int c[][];//储存路径
 int fx[];
 int fy[];//遍历顺序
 int N,I,J,flag;
 Maze(int n)
 {
 this.N=n-1;
 b=new boolean[n][n];
 c=new int [n*n][3];
 int xx[]= {0,-1,0,1,-1,-1,1,1};
 int yy[]= {-1,0,1,0,-1,1,-1,1};//上,左,下,右,左上,左下,右上,右下
 fx=xx;
 fy=yy;
 }
 public void over(int i,int j)
 {
	 this.I=i;
	 this.J=j;
 }
 public void dfs(int x,int y,int k)
 {
	 c[k][1]=x;
	 c[k][2]=y;
	 //先存入此点
	 if(x==I&&y==J)
	 {
		 print(k);
	 }
	 int tx=0,ty=0;
	 for(int i=0;i<8;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]+")");
   flag++;
 }
 public void print1()
 {   if(flag==0)
	 System.out.print("没有路径");
 }
}

(创作这道题的原因,是因为朋友问我能否走出他设的迷宫,刚好又是刚学会迷宫路径,但我又不想局限于就四个方向探索, 所以就创作了这个八个方向纵情探索任意两点路径的升级版。)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
问题描述: 以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出从入口(0,0)到出口(m-1,n-1)的通路和通路总数,或得出没有通路的结论。例如下图, 0(入口) 1 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0(出口) 从入口到出口有6条不同的通路。 而下图: 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 从入口到出口则没有通路。 算法设计: 给定一个m*n的长方阵表示迷宫,设计算法输出入口到出口的通路和通路总数,或得出没有通路的结论。 算法提示: 和皇后问题与分书问题类似。可以用二维数组存储迷宫数据,对于迷宫中任一位置,均可约定有东、南、西、北四个方向可通。从当前位置a(用(x,y)表示一个位置,假定它是以向右的x轴和向下的y轴组成的平面上的一个点)出发依次尝试四个方向是否有路,若某个方向的位置b可通,则按照同样的方法继续从b出发寻找。若到达出口,则找到一条通路。 数据输入: 由文件input.txt 提供输入数据。第一行是m和n的值,空格分隔,其后共m行。每行有n个数字,数和数之间用空格分隔。 结果输出: 将计算出的所有从入口到出口的通路输出到文件output.txt 中。若没有通路,则将0写入文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值