3.2迷宫求解

文章提供了一个使用Java编写的控制台迷宫游戏,玩家可以通过输入坐标来探索迷宫。同时,还展示了C语言实现的迷宫路径搜索算法,该算法通过栈来暴力寻找从起点到终点的路径。迷宫由二维数组表示,墙壁和可行走区域有特殊标记。
摘要由CSDN通过智能技术生成

首先我没 看懂数据结构书上写得迷宫 求解 不过 不重要了

迷宫求解 需要先有个 迷宫 游戏
以下 是 Java写的 控制台迷宫游戏

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MazeGameJ {
    public static void main(String[] args) {
        //地图模拟
        //二维数组 0表示墙  1 表示可以走
        //(1,1)表示起点  (8,8)表示终点
        int[][] ints = new int[10][10];

        //记录走过的位置
        //0 位置存储 棋盘横坐标
        //1 位置存储棋盘纵坐标
        int[][] run_point = new int[100][2];
        run_point[0][0]=1;
        run_point[0][1]=1;

        //初始化地图
        init(ints);

        //开始游戏
        run(ints,run_point);

//        show(ints);

    }

    public  static  void  init(int[][]ints){
        //四周墙
        for (int i = 0; i <10 ; i++) {
            ints[0][i] = 1;
            ints[9][i] = 1;
            ints[i][0] = 1;
            ints[i][9] = 1;
        }

        //中间墙
        ints[8][1]=1;
        ints[4][2]=1;
        ints[6][2]=1;
        ints[7][2]=1;
        ints[1][3]=1;
        ints[2][3]=1;
        ints[4][3]=1;
        ints[7][3]=1;
        ints[4][4]=1;
        ints[5][4]=1;
        ints[7][4]=1;
        ints[7][5]=1;
        ints[3][6]=1;
        ints[6][6]=1;
        ints[7][6]=1;
        ints[2][7]=1;
        ints[7][7]=1;
        ints[3][3]=1;
        ints[4][6]=1;
        ints[5][6]=1;
        ints[2][5]=1;

    }
    public static void  show(int[][] ints,int[][] run_point,int step){
        for (int i = 0; i <= step; i++) {
            ints[run_point[step][0]][run_point[step][1]]=2;
        }

        for (int i = 0; i <10 ; i++) {
            for (int j = 0; j <10 ; j++) {
                if(ints[i][j]==0){
                    System.out.format("\33[32;1m");
                    System.out.print("A");
                    System.out.print(" ");
                }else if(ints[i][j]==2){
                    System.out.format("\33[0m");
                    System.out.print("B");
                    System.out.print(" ");
                }else {
                    System.out.format("\33[31;1m");
                    System.out.print("#");
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
    }
    public  static  void  run(int[][] ints,int[][] run_point){
        int step =0;
        show(ints,run_point,step);
        Scanner scanner = new Scanner(System.in);
        while (true){
            //步数
            System.out.format("\33[0m");
            System.out.print("请输入一个坐标:\n");
            String s = scanner.nextLine();
            //输入合法性a,b
            Pattern pattern = Pattern.compile("[1-8],[1-8]");
            Matcher matcher = pattern.matcher(s);
            if(matcher.matches()){
                String[] split = s.split(",");
                //位置连续性检查
                if((run_point[step][0]+1==Integer.parseInt(split[0])&&run_point[step][1] ==Integer.parseInt(split[1]))
                        || (run_point[step][0]==Integer.parseInt(split[0])&&run_point[step][1]+1 ==Integer.parseInt(split[1]))
                        || (run_point[step][0]-1==Integer.parseInt(split[0])&&run_point[step][1]==Integer.parseInt(split[1]))
                        || (run_point[step][0]==Integer.parseInt(split[0])&&run_point[step][1]-1 ==Integer.parseInt(split[1]))
                ){
                    //判断是否不能走
                    if (ints[Integer.parseInt(split[0])][Integer.parseInt(split[1])]==0) {

                        //判断胜利结束
                        if (Integer.parseInt(split[0])==8&&Integer.parseInt(split[1])==8) {
                            step++;
                            run_point[step][0] = Integer.parseInt(split[0]);
                            run_point[step][1] = Integer.parseInt(split[1]);
                            System.out.print("\033[H\033[2J");
                            System.out.flush();
                            show(ints,run_point,step);
                            System.out.println("恭喜你!通关了!");
                            System.exit(1);
                        }
                        step++;
                        run_point[step][0] = Integer.parseInt(split[0]);
                        run_point[step][1] = Integer.parseInt(split[1]);
                    }else {
                        System.out.println("游戏结束!");
                        System.exit(1);
                    }

                }else {
                    System.out.println("输入不合法请重新输入");
                }


            }else {
                System.out.println("输入不合法请重新输入");
            }

            //显示
            System.out.print("\033[H\033[2J");
            System.out.flush();
        
            show(ints,run_point,step);

        }

    }

}


然后求解 下面是 求解 c代码

#include <stdio.h> 

typedef  int PosTyoe[2];

typedef int MazeType[10][10];
typedef int Status;

typedef struct {

 //   int ord; //通道块在路径上的顺序
	PosTyoe seat; //通道块在迷宫中的坐标位置
//	int di; //从通道走向下一通道的方向
}SElemType; //栈的元素类型

Status MazePath(MazeType maze,PosTyoe start,PosTyoe end) {
	//利用栈 暴力寻找迷宫出路 
	//策略 下 右 上 左 的顺序

	//创建一个栈  将 初始位置 放在栈里
	//用数组模拟栈
	int i;
	SElemType  IninStack__ [1000];

	//栈顶位置
	i = 0;
	//将初始位置 放在栈里
	IninStack__[i].seat[0] = start[0];
	IninStack__[i].seat[1] = start[1];
	maze[IninStack__[i].seat[0]][IninStack__[i].seat[1]] = 1;
	++i;

	//开始寻找 
	while (i)
	{	

		//判断是否已经到达终点
		if (IninStack__[i - 1].seat[0] + 1 == end[0] && IninStack__[i - 1].seat[1] == end[1]) {
			IninStack__[i].seat[0] = IninStack__[i - 1].seat[0] + 1;
			IninStack__[i].seat[1] = IninStack__[i - 1].seat[1];
			++i;
			break;
		}

		//判断是否已经到达终点
		if (IninStack__[i - 1].seat[0]  == end[0] && IninStack__[i - 1].seat[1]+1 == end[1]) {
			IninStack__[i].seat[0] = IninStack__[i - 1].seat[0];
			IninStack__[i].seat[1] = IninStack__[i - 1].seat[1]+1;
			++i;
			break;
		}



		//先往下寻找 maze的 i+1
		if (maze[IninStack__[i-1].seat[0] + 1][IninStack__[i-1].seat[1]] != 1) {
			//如果不是0,表示能通过
					//这时候就将这个 位置进栈
					IninStack__[i].seat[0] = IninStack__[i - 1].seat[0] + 1;
					IninStack__[i].seat[1] = IninStack__[i - 1].seat[1];
					//将走过的位置设置为墙 不能 往回走
					maze[IninStack__[i - 1].seat[0] + 1][IninStack__[i - 1].seat[1]] = 1;
					++i;
					continue;
	
	

		}
		//尝试往右走
		if (maze[IninStack__[i-1].seat[0] ][IninStack__[i-1].seat[1]+1] != 1)
		{
			    //如果不是0,表示能通过}
               //这时候就将这个 位置进栈
				IninStack__[i].seat[0] = IninStack__[i - 1].seat[0];
				IninStack__[i].seat[1] = IninStack__[i - 1].seat[1] + 1;
				//将走过的位置设置为墙 不能 往回走
				maze[IninStack__[i - 1].seat[0]][IninStack__[i - 1].seat[1] + 1] = 1;
				++i;

				continue;
			

		}

		//尝试往上走
		if (maze[IninStack__[i - 1].seat[0]-1][IninStack__[i - 1].seat[1]] != 1)
		{	

			//如果不是0,表示能通过
				//没走过就可以走
			//这时候就将这个 位置进栈
				IninStack__[i].seat[0] = IninStack__[i - 1].seat[0]-1;
				IninStack__[i].seat[1] = IninStack__[i - 1].seat[1];
				//将走过的位置设置为墙 不能 往回走
				maze[IninStack__[i - 1].seat[0] - 1][IninStack__[i - 1].seat[1]] = 1;
				++i;
				continue;

		}

		//尝试往左走
		if (maze[IninStack__[i - 1].seat[0] ][IninStack__[i - 1].seat[1]-1] != 1)
		{
			//如果不是0,表示能通过
			//这时候就将这个 位置进栈
				IninStack__[i].seat[0] = IninStack__[i - 1].seat[0];
				IninStack__[i].seat[1] = IninStack__[i - 1].seat[1]-1;
				//将走过的位置设置为墙 不能 往回走
				maze[IninStack__[i - 1].seat[0]][IninStack__[i - 1].seat[1] - 1] = 1;
				++i;
				continue;
			

		}

		//如果都没有走通
		//标记自己所在点为不通,将自己出栈
		maze[IninStack__[i - 1].seat[0]][IninStack__[i - 1].seat[1]] = 1;
		--i;

	}

	if (!i) {
		printf("此迷宫没有解\n");
		return 0;
	}

	int j;
	for (j = 1; j < i; j++) {
		printf("%d,%d\n",IninStack__[j].seat[0], IninStack__[j].seat[1]);
	}
	return 0;

}


int main() {
	MazeType maze;
	PosTyoe start;
	PosTyoe end;
	//四周墙
	int i;
	for (i = 0; i < 10; i++) {
		maze[0][i] = 1;
		maze[9][i] = 1;
		maze[i][0] = 1;
		maze[i][9] = 1;
	}
	//中间墙
	maze[8][1] = 1;
	maze[4][2] = 1;
	maze[6][2] = 1;
	maze[7][2] = 1;
	maze[1][3] = 1;
	maze[2][3] = 1;
	maze[4][3] = 1;
	maze[7][3] = 1;
	maze[4][4] = 1;
	maze[5][4] = 1;
	maze[7][4] = 1;
	maze[7][5] = 1;
	maze[3][6] = 1;
	maze[6][6] = 1;
	maze[7][6] = 1;
	maze[2][7] = 1;
	maze[7][7] = 1;
	maze[3][3] = 1;
	maze[4][6] = 1;
	maze[5][6] = 1;
	maze[2][5] = 1;

	start[0] = 1;
	start[1] = 1;

	end[0] = 8;
	end[1] = 8;

	MazePath(maze, start, end);

	return 0;
};


看效果 在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值