迷宫老鼠游戏

2023-05-16

迷宫老鼠游戏
【题目】

       以一个m×n的长方阵表示迷宫,01分别表示迷宫中的通路和障碍。请设计一个算法,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论;如果有通道,请输出最短路径的通道。例如:

【分析】

       首先用一个二维数组存储该迷宫,从起点位置(0,0开始分支遍历,将起点位置作为当前扩展结点,扩展出所有出未被访问过的有效结点,即该位置不是路障,而是通路,将所有这些有效结点依次加入到队列中,同时记录该有效结点的前驱结点,可用二维数组进行记录,此时从起始位置到达该有效结点的位置的路长为到达前驱结点的路长加1。再从队列中取出一个结点作为当前的扩展结点,重复上述操作,直到队列为空或者达到终点位置。

       当没有通路时,输出“No”;

       当存在通路时,输出“Yes”,并输出最短路径,同时输出最短路径的路长。

【伪代码】

void sovle(int n, int m, int[][] g) {
	int[] dx 定义x方向上的移动方式;
	int[] dy 定义y方向上的移动方式;

	定义活结点队列 q;
	定义用于存储位置是否被访问的二维数组;

	将起始位置加入到队列q中;
	标记起始位置已被访问;
	
	定义用于记录前驱结点的二维数组;
	
	while(队列q不为空) {
		从队列q中取出队头作为当前的扩展结点;
		
		if(该扩展结点为终点位置)
			break;

		for(int i = 0; i < 4; i++) {
			通过移动,得出新的子结点;
			if(该子结点没有越界,并且该结点未被访问,为通路) {
				将该子结点加入到队列中;
				标记该子结点位置已被访问;
				记录该子结点的前驱结点为当前扩展结点;
				记录起始位置到达该结点的路长 = 前驱结点的路长 + 1;
			}
		}
	}

	if(终点位置的结点没有被访问过)
		输出No;
	else {
		创建一个栈,并将终点结点加入栈中;
		while(true) {
			找到当前结点的前驱结点,加入到栈中;
			if(前驱结点的位置为起始位置)
				break;
			修改当前结点为前驱结点;
		}
		
		从栈中依次取出结点,输出结点位置,即为所求最短通道路径;
		输出最短路径长度;
	}
}
【程序】

用java语言编写程序,代码如下:

import java.io.BufferedInputStream;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;

public class MazeGame {
	public static void main(String[] args) {
		Scanner input = new Scanner(new BufferedInputStream(System.in));
		int n = 0, m = 0;
		
		while(input.hasNext()) {
			n = input.nextInt();
			m = input.nextInt();

			if(n == 0 && m == 0)
				break;
			
			int[][] g = new int[n][m];
			
			for(int i = 0; i < n; i++)
				for(int j = 0; j < m; j++)
					g[i][j] = input.nextInt();
			
			solve(n, m, g);
		}
	}
	
	public static void solve(int n, int m, int[][] g) {
		int[] dx = {1, 0, -1, 0};
		int[] dy = {0, 1, 0, -1};
		
		Queue<Pos> q = new LinkedList<Pos>();
		boolean[][] isVisited = new boolean[n][m];
		
		Pos p0 = new Pos(0, 0);
		p0.dist = 0;
		isVisited[0][0] = true;
		
		q.add(p0);
		Pos[][] prev = new Pos[n][m];
		
		int x = 0, y = 0, tx = 0, ty = 0;
		Pos p = new Pos();
		while(!q.isEmpty()) {
			p = q.poll();
			x = p.x; y = p.y;
			if(x == n - 1 && y == m - 1) break;
			
			for(int i = 0; i < 4; i++) {
				tx = dx[i] + x; ty = dy[i] + y;
				if(tx >= 0 && ty >= 0 && tx < n && ty < m) {
					if(!isVisited[tx][ty] && g[tx][ty] == 0) {
						Pos p1 = new Pos(tx, ty);
						prev[tx][ty] = p;
						p1.dist = p.dist + 1;
						isVisited[tx][ty] = true;
						q.add(p1);
					}
				}
			}
		}
		
		if(!isVisited[n - 1][m - 1])
			System.out.println("No");
		else {
			System.out.println("Yes");
			
			Stack<Pos> sp = new Stack<Pos>();
			sp.add(p);
			int ex = n - 1, ey = m - 1;
			while(true) {
				Pos p2 = prev[ex][ey];
				sp.add(p2);
				if(p2.x == 0 && p2.y == 0)
					break;
				
				ex = p2.x;
				ey = p2.y;
			}

			Pos p3 = sp.pop();
			System.out.print("(" + p3.x + "," + p3.y + ")");
			int i = 2;
			while(!sp.isEmpty()) {
				p3 = sp.pop();
				if(i % 10 == 1) {
					System.out.print("\n(" + p3.x + "," + p3.y + ")");
				}
				else
					System.out.print(" (" + p3.x + "," + p3.y + ")");
				i++;
			}
			System.out.println("\n" + p.dist);
		}
	}
	
	static class Pos {
		int x, y;
		int dist;
		public Pos(int x, int y) {
			this.x = x;
			this.y = y;
		}
		public Pos() {
		}
	}
}
【结果】

       运行程序,输入10 10和迷宫的布局,输出结果:

【体会】

     分支限界法以广度优先或以最小耗费优先的方式搜索解空间。分支限界法的搜索策略是,在扩展结点处,先生成其所有的儿子结点(分支),然后再从当前的活结点表中选择下一个扩展结点。为了有效地选择下一扩展结点,加速搜索的进程,在每一活结点处,计算一个函数值(限界),并根据函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间上有最优解的分支推进,以便尽快地找出一个最优解。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迷宫老鼠游戏 的相关文章

  • 代码对齐(Alignment of Code)

    Alignment of Code Time Limit 4000 2000 MS Java Others Memory Limit 32768 32768 K Java Others Total Submission s 958 Acce
  • Ducci序列(Ducci Sequence)

    Ducci Sequence Time limit 3 000 seconds A Ducci sequence is a sequence of n tuples of integers Given an n tuple of integ
  • 卡片游戏(Throwing cards away I)

    Problem B Throwing cards away I Given is an ordered deck of n cards numbered 1 to n with card 1 at the top and card n at
  • 交换学生(Foreign Exchange)

    Problem E Foreign Exchange Input standard input Output standard output Time Limit 1 second Your non profit organization
  • CAN通信物理容错测试checklist

    CAN通信物理容错测试checklist 工作项目中 xff0c 我们有时有些产品CAN总线功能 xff0c 一般情况下我们必须要满足以下几种状况的测试项才算符合要求 一 CAN H与CAN L短路 判定标准 xff1a 短接故障发生后 x
  • 对称轴(Symmetry)

    Symmetry Time limit 3 000 seconds The figure shown on the left is left right symmetric as it is possible to fold the she
  • 打印队列(Printer Queue)

    Printer Queue Time limit 3 000 seconds 分析 首先记录所求时间它在队列中的位置 xff0c 用一个队列存储这些任务的优先级 xff0c 同时也创建一个队列存储对应任务一开始的位置 xff0c 那么当我们
  • 更新字典(Updating a Dictionary)

    Updating a Dictionary Time Limit 1000MS Memory Limit Unknown 64bit IO Format lld amp llu Submit Status Description In th
  • 铁轨(Rails)

    Rails Time limit 3 000 seconds Rails There is a famous railway station in PopPush City Country there is incredibly hilly
  • 矩阵链乘(Matrix Chain Multiplication)

    Matrix Chain Multiplication Time Limit 3000MS Memory Limit Unknown 64bit IO Format lld amp llu Submit Status Description
  • 天平(Not so Mobile)

    Not so Mobile Time Limit 3000MS Memory Limit Unknown 64bit IO Format lld amp llu Submit Status Description Before being
  • 下落的树叶(The Falling Leaves)

    The Falling Leaves Time Limit 3000MS Memory Limit Unknown 64bit IO Format lld amp llu Submit Status Description Each yea
  • 四分树(Quadtrees)

    Quadtrees Time Limit 3000MS Memory Limit Unknown 64bit IO Format lld amp llu Submit Status Description A quadtree is a r
  • 油田(Oil Deposits)

    Oil Deposits Time Limit 3000MS Memory Limit Unknown 64bit IO Format lld amp llu Submit Status Description The GeoSurvCom
  • Abbott的复仇(Abbott's Revenge)

    Abbott 39 s Revenge Time limit 3 000 seconds Abbott s Revenge Abbott s Revenge The 1999 World FinalsContest included a p
  • rockchip rk3568 openwrt修改根文件系统分区

    rk3568的openwrt根文件系统分区大小如何修改 xff1f 1 rootfs大小取决于rk356x config的配置 xff0c 默认CONFIG TARGET ROOTFS PARTSIZE 61 512 xff0c 如果需要修
  • 除法(Division)

    Division Time Limit 3000MS Memory Limit Unknown 64bit IO Format lld amp llu Submit Status Description Write a program th
  • 最大乘积(Maximum Product)

    Maximum Product Time Limit 3000MS Memory Limit Unknown 64bit IO Format lld amp llu Submit Status Description Problem D M
  • 分数拆分(Fractions Again?!)

    Fractions Again Time Limit 3000MS Memory Limit Unknown 64bit IO Format lld amp llu Submit Status Description Problem A F

随机推荐

  • 二叉树(Tree Recovery)

    Tree Recovery Time Limit 3000MS Memory Limit Unknown 64bit IO Format lld amp llu Submit Status Description Little Valent
  • 骑士的移动(Knight Moves)

    Knight Moves Time Limit 3000MS Memory Limit Unknown 64bit IO Format lld amp llu Submit Status Description A friend of yo
  • 单词(Play On Words)

    分析 首先需对欧拉道路有所了解 存在欧拉道路的充分条件 xff1a 对于无向图而言 xff0c 如果一个无向图是连通的 xff0c 且最多只有两个奇点 xff08 顶点的度数为奇数 xff09 xff0c 则一定存在欧拉道路 如果有两个奇点
  • 成语接龙(Idiomatic Phrases Game)

    Idiomatic Phrases Game Problem Description Tom is playing a game called Idiomatic Phrases Game An idiom consists of seve
  • DijKstra算法(单源最短路径)

    原文转载自 xff1a 梦醒潇湘love 转载原文是为了方便自己学习 xff0c 也希望能让更多读者在需要的情况下学到更多的知识 Dijkstra xff08 迪杰斯特拉 xff09 算法是典型的最短路径路由算法 xff0c 用于计算一个节
  • Floyd算法(最短路径)

    Floyd 算法允许图中有带负权值的边 xff0c 但不许有包含带负权值的边组成的回路 原文转载自 xff1a 梦醒潇湘love 上一篇文章我们通过迪杰斯特拉算法解决了从某个源点到其余各顶点的最短路径问题 从循环嵌套很容易得到此算法的时间复
  • 最爱的城市

    最爱的城市 时间限制 xff1a 1 秒 内存限制 xff1a 32 兆 特殊判题 xff1a 否 标签 Floyd最短路径 题目描述 一天小明捧着一本世界地图在看 xff0c 突然小明拿起笔 xff0c 将他最爱的那些城市标记出来 xff
  • Docker中配置Nginx多域名配置多个应用

    注意容器中是一个被隔离的空间 xff0c 可以理解为一个独立的服务器 xff0c 所以在做反向代理的时候 xff0c nginx配置不能使用localhost xff0c 可以使用link方式去访问其他容器 nginxa container
  • 八皇后问题(回溯法)

    八皇后问题 xff08 源于 刘汝佳的 算法竞赛入门经典 xff08 第2版 xff09 xff09 在棋盘上放置8个皇后 xff0c 使得它们互不攻击 xff0c 此时每个皇后的攻击范围为同行同列和同对角线 xff0c 要求找出所有解 x
  • 大整数的乘法

    大整数的乘法 xff08 这里主要讨论的是两个较大的数相乘的效率问题 xff0c 实际上并不是真正意义上的大数相乘 在java中有个BigInteger类已经可以储存大数 xff0c 并提供了大数相乘的方法了 xff09 分析 首先 xff
  • 2的次幂表示

    2的次幂表示 时间限制 xff1a 1 0s 内存限制 xff1a 512 0MB 问题描述 任何一个正整数都可以用2进制表示 xff0c 例如 xff1a 137的2进制表示为10001001 将这种2进制表示写成2的次幂的和的形式 xf
  • 扑克序列

    扑克序列 题目描述 标题 xff1a 扑克序列 A A 2 2 3 3 4 4 xff0c 一共4对扑克牌 请你把它们排成一行 要求 xff1a 两个A中间有1张牌 xff0c 两个2之间有2张牌 xff0c 两个3之间有3张牌 xff0c
  • 分糖果

    分糖果 时间限制 xff1a 1 0s 内存限制 xff1a 256 0MB 问题描述 有n个小朋友围坐成一圈 老师给每个小朋友随机发偶数个糖果 xff0c 然后进行下面的游戏 xff1a 每个小朋友都把自己的糖果分一半给左手边的孩子 一轮
  • 最长公共子序列(LCS)

    最长公共子序列LCS问题 给定2个序列X和Y xff0c 当另一序列Z既是X的子序列又是Y的子序列时 xff0c 称Z是序列X和Y的公共子序列 给定X 61 x1 x2 xm 和Y 61 y1 y2 yn xff0c 请找出X和Y的最长公共
  • 0-1背包问题

    0 1背包问题 甲欲出去旅游 xff0c 可携带20 公斤的行李 xff0c 已知甲想带的 5 件行李的重量及其在旅行中产生的效益如下表所示 xff1a 行李编号 I II III IV V 重量 千克 6 4 8 8 4 行李效益 8 4
  • 旅行售货员问题

    旅行售货员问题 题目 某售货员要到4 个城市去推销商品 xff0c 已知各城市之间的路程 xff0c 如右图所示 请问他应该如何选定一条从城市 1 出发 xff0c 经过每个城市一遍 xff0c 最后回到城市 1 的路线 xff0c 使得总
  • https网页加载http资源时不显示图片,报错解决方案

    https网页加载http资源时不显示图片 xff0c 报错解决方案 自动将http的不安全请求升级为https静态文件放置本地反向代理请求http资源 加载http资源时会报错 xff1a 自动将http的不安全请求升级为https 页面
  • 数独游戏

    数独游戏 题目 九宫格是在81个格子 9 9 中 xff0c 要满足以下条件 xff1a xff08 1 xff09 每个横行和竖列中的9个格子都包含数字1 xff5e 9 xff0c 且不重复 xff1b xff08 2 xff09 每个
  • 静态内部类和普通内部类

    两种内部类 Java的内部类有两种 xff0c 一种是静态内部类 xff0c 另一种是普通内部类 xff0c 普通内部类可以获得外部对象的引用 xff0c 所以在普通内部类能够访问外部对象的成员变量 xff0c 也就能够使用外部类的资源 x
  • 迷宫老鼠游戏

    迷宫老鼠游戏 题目 以一个m n的长方阵表示迷宫 xff0c 0 和 1 分别表示迷宫中的通路和障碍 请设计一个算法 xff0c 对任意设定的迷宫 xff0c 求出一条从入口到出口的通路 xff0c 或得出没有通路的结论 xff1b 如果有