java dfs实现走迷宫并显示路径

符号表示

‘A’:向上走
V:/向下走
‘<’:向左走
‘>’:向右走
’ ':空地
‘P’:目的地
‘W’:墙
‘X’:此点无法到达目的地

特点

  • 自动生成障碍物
  • 可重置生成障碍物的位置
  • 形象显示路径且不使用额外数组存储路径
  • 起始点坐标默认(1,1)

地图样例

地图
生成路径
生成路径

注意事项:

  • if(findPath(x,y+1,aimx,aimy)||findPath(x+1,y,aimx,aimy)||findPath(x,y-1,aimx,aimy)||findPath(x-1,y,aimx,aimy)){//这里表明通过(x,y)点能到达目的地,所以递归将一路向上返回true,退出。
  • if(map[y][x]==AIM)
    map[aimy][aimx]=PATH;
    这一步是需要的,因为到达了目的地,用于标记可以一路退出。

代码实现及解释

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class MiGongPro {
    static char[][] map;
    static final char KONG=' ';//空
    static final char AIM='P';//目的地
    static final char SHANG='A';//向上走
    static final char XIA='V';//向下走
    static final char ZUO='<';//向左走
    static final char YOU='>';//向右走
    static final char WALL='W';//墙
    static final char BLOCK='X';//此点无法到达目的地
    public static void main(String[] args) throws IOException {
        int len,width;
        StreamTokenizer st=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        System.out.print("请输入迷宫规模(长宽大于2)"+"\n"+"请输入长度 宽度:");
        st.nextToken();
        len=(int)st.nval;
        st.nextToken();
        width=(int)st.nval;
        map=new char[len][width];
        System.out.print("请输入目标点坐标(左上角为(1,1)):");
        //请输入目标点坐标
        st.nextToken();
        int aimx,aimy;
        aimx=(int)st.nval-1;
        st.nextToken();
        aimy=(int)st.nval-1;
        String yes;
        do {
            //初始化地图
            for (int i = 0; i < len; i++) {
                for (int j = 0; j < width; j++) {
                    map[i][j]=KONG;
                }
            }
            for (int i = 0; i < len; i++) {
                map[i][0]=WALL;
                map[i][width-1]=WALL;
            }
            for (int j = 1; j < width-1; j++) {
                map[0][j]=WALL;
                map[len-1][j]=WALL;
            }
            map[aimy][aimx]=AIM;
            System.out.println("随机生成障碍物中");
            for (int i = 0; i < len; i++) {
                int wx = (int) (Math.random() * (width - 2) + 1);
                int wy = (int) (Math.random() * (len - 2) + 1);
                if (map[wy][wx] == KONG && !(wx == 1 && wy == 1))//不生成在非空或起始点或目的地
                    map[wy][wx] = WALL;
                else
                    i--;
            }
            //打印迷宫
            System.out.println("生成地图如下:");
            for (char[] ma : map) {
                for (char i : ma) {
                    System.out.print(i + " ");
                }
                System.out.println();
            }
            System.out.println("是否重新生成障碍物?(y/n");
            st.nextToken();
            yes=st.sval;
        }while (yes.charAt(0)=='y'||yes.charAt(0)=='Y');
        boolean can=findPath(1,1,aimx,aimy,XIA);
        System.out.println("生成路径如下:");
        for(char[] ma:map){
            for(char i:ma){
                System.out.print(i+" ");
            }
            System.out.println();
        }
        if(!can)
            System.out.println("无路可走");
    }
    static boolean findPath(int x,int y,int aimx,int aimy,char fx){
        if(map[y][x]==AIM){//到达目的地,标记以便通过@退出递归调用
            map[aimy][aimx]=fx;
        }
        if(map[aimy][aimx]!=AIM){//@
            return true;
        }
        if(map[y][x]!=KONG)//未到目的地且走不通
            return false;
        map[y][x]=fx;//尝试加入路径
        if(findPath(x,y+1,aimx,aimy,XIA)||findPath(x+1,y,aimx,aimy,YOU)||findPath(x,y-1,aimx,aimy,SHANG)||findPath(x-1,y,aimx,aimy,ZUO)){//下右上左探索地图找目标点
            return true;
        }
        else{//都不能到达目标点,所以从(x,y)坐标无法到达目标点,标记该点已经被探索且无法到达
            map[y][x]=BLOCK;//不能加入路径
            return false;
        }
    }
}

测试用例

请输入迷宫规模(长宽大于2)
请输入长度 宽度:8 8
请输入目标点坐标(左上角为(1,1)):3 7
随机生成障碍物中
生成地图如下:
W W W W W W W W 
W       W     W 
W     W   W   W 
W W W W       W 
W             W 
W W           W 
W   P   W     W 
W W W W W W W W 
是否重新生成障碍物?(y/n
y
随机生成障碍物中
生成地图如下:
W W W W W W W W 
W     W       W 
W W   W W     W 
W     W       W 
W W           W 
W           W W 
W W P         W 
W W W W W W W W 
是否重新生成障碍物?(y/n
n
生成路径如下:
W W W W W W W W 
W V > W       W 
W W V W W     W 
W   V W       W 
W W V         W 
W   V       W W 
W W V         W 
W W W W W W W W 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值