3.2迷宫求解

news2024/11/15 15:25:28

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

迷宫求解 需要先有个 迷宫 游戏
以下 是 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;
};


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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/706490.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生|kubernetes|centos7下离线化部署kubesphere-3.3.2---基于kubernetes-1.22.16(从网络插件开始记录)

前言&#xff1a; kubesphere的离线化部署指的是通过自己搭建的harbor私有仓库拉取镜像&#xff0c;完全不依赖于外部网络的方式部署。 我的kubernetes集群是一个单master节点&#xff0c;双工作节点&#xff0c;总计三个节点的版本为1.22.16的集群。 该集群只是初始化完成了…

在Excel当前窗口显示最后一行数据

大家也许都知道Excel工作表中数据行数较多&#xff0c;使用<Ctrl下箭头>组合键可以快速定位最后一行&#xff0c;但是如果数据不是连续的&#xff08;也就是工作表中包含空行&#xff09;&#xff0c;这个方式就只能定位到当前连续数据区域的最后一行。 如下实例代码可以…

Visual Studio2019更改并下载.Net Framework目标框架

一、问题 当使用.net进行开发时&#xff0c;开发的项目与.net framework目标框架会非常密切相关的&#xff0c;所以当vs本地使用的.net framework框架与该项目工程的框架不一致的时候&#xff0c;就可能打开不了当前项目&#xff0c;解决这个问题的方法有&#xff1a; 第一种…

方向导数和梯度

理性认识的三个阶段&#xff1a;定义、判断、推理。 有位博主说过&#xff0c;数学中&#xff0c;定义占60%的内容。 方向导数定义如下&#xff1a; 注意的一点是&#xff1a; 该处的alpha&#xff0c;beta角度关系是alpha beta pi/2。t*cos alpha &#xff0c;t * cos …

两百行代码实现简易点云标注工具

夏天来了非常热&#xff0c;LZ周末不想出去玩&#xff0c;于是乎继之前的图片标注工具利用两个晚上写了一个简单的点云标注工具。该工具基于Qt5.14.2-msvc2017&#xff08;其实LZ的VS版本是2019&#xff0c;似乎兼容&#xff09;平台C语言开发&#xff0c;用到的第三方库为PCL1…

ModaHub魔搭社区:“百模大战”下,字节跳动选择做一个“大模型商场”

“火山方舟”面向企业提供模型精调、评测、推理等全方位的平台服务&#xff08;MaaS&#xff0c;即Model-as-a-Service&#xff09;&#xff0c;目前集成了百川智能、出门问问、复旦大学MOSS、IDEA研究院、澜舟科技、MiniMax、智谱AI等多家AI科技公司及科研团队的大模型。 这种…

通过elementui的el-table实现table嵌套展示

el-table属性&#xff1a; :expand-row-keys: 可以控制行的展开和关闭&#xff0c;也可以控制只能有一行进行展开 expand-change&#xff1a;是表格行的切换事件&#xff0c;具体方法如下 el-table-column属性&#xff1a; type"expand" &#xff1a;表示如果有子t…

从网上复制shell脚本 到 linux下运行 碰到的各种问题汇总

从网上复制shell脚本 到 linux下运行 碰到的各种问题汇总 快捷键CtrlU查看网页源码 一、报错现象&#xff1a;: No such file or directory 解决方法&#xff1a;在linux系统下执行&#xff1a;dos2unix filename 问题原因&#xff1a;本质是文件中二进制符号^M乱码问题 参考…

JAVA学习(七)

1. JAVA 多线程并发 1.1 JAVA 并发 并发知识库 1.2 JAVA 线程实现/创建 创建方式 1.2.1 承 继承 Thread 类 Thread 类本质上是实现了 Runnable 接口的一个实例&#xff0c;代表一个线程的实例。启动线程的唯一方 法就是通过 Thread 类的 start()实例方法。start()方法是一个…

c++实现httpd服务器

文章目录 网络的初始化端口的分配协议的使用WSAStartup函数参数1&#xff1a;WORD wVersionRequested参数2&#xff1a;LPWSADATA lpWSAData返回值 int代码实现 创建套接字int af表示套接字的类型(网络套接字 文件套接字)int type数据流 数据报int protocol 通信协议 TCP &…

网络空间安全数学基础考试要点

网络空间安全数学基础 阶的计算不要求那个公式&#xff0c;但是Order几次方要求 考试会考原根 Legendre必考 多项式计算必考 扩域多项式计算 同态不考 域元素表示 本元多项式不考 1.整除 3 ≡ \equiv ≡ 4 mod 7不对吧3 ≡ \equiv ≡ 3 mod 74 ≡ \equiv ≡ 4 &#xff08;m…

DITA技巧:给文字加颜色

- 1 - 场景 在文档中&#xff0c;我们有时候会在文字中使用颜色。 比如&#xff1a; 在文档中&#xff0c;使用在文字上加颜色来代表一定意义。使用MS Word编写文档的时候&#xff0c;直接在文字上加颜色就可以了。转换成DITA以后&#xff0c;大家会发现在XML编辑器的工具栏…

css实现大屏效果的背景div

实现大屏效果的背景div, 效果如下: html <div class"box">1111111</div>css .box {width: 200px;height: 80px;background: linear-gradient(270deg, #00cda2, #00cda2) 0 0 no-repeat,linear-gradient(180deg, #00cda2, #00cda2) 0 0 no-repeat,line…

JUC高并发编程-初篇(后续发布高阶篇)

JUC高并发编程 1.JUC概述 1.1 什么是JUC JUC就是java.util.concurrent工具包的简称。这是一个处理线程的工具包&#xff0c;JDK1.5开始出现的。 1.2 线程和进程概念 进程&#xff1a;指在系统中正在运行的一个应用程序&#xff1b;程序一旦运行就是进程&#xff1b;进程—…

数据结构--队列的基本概念

数据结构–队列的基本概念 队列的定义 队列其实是一种受限制的线性表 队列(Queue)&#xff1a;是 只允许在一端进行插入或删除操作 \color{red}只允许在一端进行插入或删除操作 只允许在一端进行插入或删除操作的线性表 重要术语: 队头、队尾、空队列 队列的特点: 先进先出 \…

表格检测识别技术面临的挑战和发展趋势

第四章 表格检测识别技术面临的挑战和发展趋势 现在表格区域检测的准确率已经很高了。但检测和识别是相辅相成的&#xff0c;单独的检测不够完善。如何利用检测和结构识别的结果互相提高效果&#xff0c;是未来的研究方向和重点。 由于表格应用场景较为广泛&#xff0c;表格形…

【MySQL学习笔记】(三)操作表(结构)

表 1 创建表2 查看表结构3 修改表4 删除表 注&#xff1a;本篇文章操作的是表的结构&#xff0c;并不是表的内容。 属于笔记&#xff08;一&#xff09;中的SQL分类中的DDL 1 创建表 语法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 d…

线程同步器:CountDownLatch、CyclicBarrier、Semaphore

CountDownLatch 日常开发中经常遇到一个线程需要等待一些线程都结束后才能继续向下运行的场景&#xff0c;在CountDownLatch出现之前通常使用join方法来实现&#xff0c;但join方法不够灵活&#xff0c;所以开发了CountDownLatch。场景&#xff1a;一个等其他多个线程&#xf…

消息中间件进阶学习

文章目录 1、RabbitMQ1.1、如何保证消息不丢失&#xff1f;小总结面试快速答法 1.2、消息的重复消费问题面试快速答法 1.3、死信交换机小总结面试快速答法 1.4、消息堆积怎么解决小总结面试快速答法 1.5、集群小总结面试快速答法 2、Kafka2.1、Kafka是如何保证消息不丢失小总结…

Linux中Docker详细安装说明

1.准备环境 说明&#xff1a;准备Linux系统centos7版本(以上) 2.切换管理模式 说明&#xff1a;输入一下命令&#xff0c;然后回车&#xff0c;输入密码。 su – 3.更新yum 说明&#xff1a;为了保证doker能够给顺利安装&#xff0c;那么更新一下&#xff1b;如果没有也可以…