迷宫

迷宫算法——验证迷宫的可通性

故事扮演 提交于 2020-01-02 00:47:58
【Qboy原创】 记得在大学学习数据结构时就学过采用迭代方式可以判断一个迷宫是否有解无解甚至可以查找出所有的可能的出口。目前公司开发一个游戏需要玩家去搭建迷宫让其他玩家去闯迷宫的游戏,游戏其实很简单。但是有一个重点就是要验证玩家所搭建的迷宫是否可到达。好吧这就是我们接下去算法的需求。写下此文只是为了Mark过程。   首先先创建必须的结构体   (1)迷宫中所有的节点类型     typedef enum{       EMPTY=0, //空白       OBSTACLE, //障碍       ENTER, //入口       EXIT, //出口     }MazeNodeType; //迷宫节点的类型   根据不同的业务需求可能还涉及到其他的节点类型,这是最基础的类型。   (2)迷宫节点:   typedef struct   {     CCPoint location;//位置     MazeNodeType nodeType;   }MazeNode;   (3)迷宫地图   typedef struct   {     MazeNode** pMazeNode;//地图的节点     int iMazeOrientation;//横向多少个     int iMazeLongitudinal;//纵向     MazeNode* pEnter;//入口   

01迷宫的总结

馋奶兔 提交于 2019-12-30 03:04:07
首先,大家先看一下题吧: 01迷宫 大体的思路:广搜。 细节:首先,我要把每次广搜的结果储存起来,然后每一次不一样的广搜(是之前从来没有遍历过的)全部储存为这一次遍历的编号。如果询问的点是以前广搜过的,那么就输出那一次广搜的结果。如果没有遍历过,那么就进行一次广搜。 代码如下: # include <iostream> # include <cstdio> # include <cstring> # include <algorithm> # include <iomanip> # include <string> # include <math.h> # include <cmath> # include <time.h> # include <cmath> # include <stack> # include <queue> //#include<windows.h> //#include <bits/stdc++.h> using namespace std ; /* 输入: 输出: */ int cnt ; //每一次广搜的计数器 int n , m ; //n行,n列,m个询问 char a [ 1001 ] [ 1001 ] ; //初始地图 int sx , sy ; //起始坐标(因为每一次都不一样) int k = 1 ; //当前遍历的编号 int g [

bfs和dfs(第一次尝试)

99封情书 提交于 2019-12-22 15:17:19
DFS和BFS的各种例题 DFS和BFS区别 走迷宫 BFS DFS DFS和BFS区别 bfs是广搜,一般是找最优解和最小路径,但是因为是一层一层的查找,所以就不适合分支太多,或者深度太深的 dfs是深搜,它解决了这个弱点,但是不能找出最优解,只能知道有解 走迷宫 描述   一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。   给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。 输入   第一行是两个整数,R和C,代表迷宫的长和宽。( 1<= R,C <= 40)   接下来是R行,每行C个字符,代表整个迷宫。   空地格子用’.‘表示,有障碍物的格子用’#‘表示。   迷宫左上角和右下角都是’.’。 输出   输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。 样例输入 5 5 …## #…# #.#.# #.#.# #.#… 样例输出 9 BFS 未优化代码实现: ( 可跳过 ) # include <stdio.h> int vst [ 1000 ] [ 1000 ] = { 0 } ; struct state { //记录可走的那个位置的深度以及坐标 int x , y ; int step_counter ; } a [

JavaScript学习笔记:迷宫游戏

不羁的心 提交于 2019-12-09 19:28:05
JavaScript学习笔记:迷宫游戏 一、游戏运行效果 二、实现步骤 1、在HBuilder里创建项目MazeGame,添加maze.html 2、在脚本里迷宫数组用于设置单元格顶边与右边 < script type = "text/javascript" > var maze = new Array ( ) ; var sides = new Array ( "Border-Top" , "Border-Right" ) ; for ( var rows = 0 ; rows < 13 ; rows ++ ) { maze [ rows ] = new Array ( ) ; } maze [ 0 ] [ 0 ] = new Array ( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ) ; maze [ 0 ] [ 1 ] = new Array ( 0 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 1 ) ; maze [ 1 ] [ 0 ] = new Array ( 1 , 0 , 0 , 0 , 1 , 0 , 1 , 1 , 1 , 0 , 1 , 1 ) ; maze [ 1 ] [ 1 ] = new Array ( 0 , 1 , 1 , 0 , 0 , 1 , 1 , 0

数据结构实验之图论四:迷宫探索oj

余生长醉 提交于 2019-12-08 04:28:48
数据结构实验之图论四:迷宫探索 Time Limit: 1000MS Memory Limit: 65536KB Problem Description 有一个地下迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关;请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点? Input 连续T组数据输入,每组数据第一行给出三个正整数,分别表示地下迷宫的结点数N(1 < N <= 1000)、边数M(M <= 3000)和起始结点编号S,随后M行对应M条边,每行给出一对正整数,表示一条边相关联的两个顶点的编号。 Output 若可以点亮所有结点的灯,则输出从S开始并以S结束的序列,序列中相邻的顶点一定有边,否则只输出部分点亮的灯的结点序列,最后输出0,表示此迷宫不是连通图。 访问顶点时约定以编号小的结点优先的次序访问,点亮所有可以点亮的灯后,以原路返回的方式回到起点。 Example Input 1 6 8 1 1 2 2 3 3 4 4 5 5 6 6 4 3 6 1 5 Example Output 1 2 3 4 5 6 5 4 3 2 1 Hint Author xam #include <stdio.h> int Map[3100][3100],v[3100]; int num,a[3100]; int n,m,c; void DFS(int x)

P1141 01迷宫 (记忆化搜索)

萝らか妹 提交于 2019-12-04 11:58:09
题目链接: https://www.luogu.org/problem/P1141 这题目就尼玛的傻逼题 (如果出现a-b-c的路可以走,那么从b出发可达到的最多的地点和从a出发是一样的!) 思路: 根据题目的要求,我把此时出发的点一直到最后走过最多点时的终点全部记录下来,那么无论如何从这些点出发走过的最多点点个数都是一样的,那么就可以搞成记忆化搜索了 1 #include <math.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <iostream> 5 #include <algorithm> 6 #include <string> 7 #include <string.h> 8 #include <vector> 9 #include <map> 10 #include <stack> 11 #include <set> 12 #include <queue> 13 14 15 #define LL long long 16 #define INF 0x3f3f3f3f 17 #define ls nod<<1 18 #define rs (nod<<1)+1 19 const int maxn = 4e5+10; 20 const double eps = 1e-9; 21 22 int n,m,cnt;

简单的dfs

被刻印的时光 ゝ 提交于 2019-12-04 01:32:13
dfs(Depth_First_Search): 它是一种图的遍历形式,其具体意义是从图中的某个顶点v出发,不停的遍历v的各个临界点,然后从各个临界点开始继续的向四周发散,直至遍历完所有与v路径相通的点,究其本质其实是应用了一种递归的思想; 模板代码为: void dfs()//参数用来表示状态 { if(到达终点状态) { ...//根据题意添加 return; } if(越界或者是不合法状态) return; if(特殊状态)//剪枝 return ; for(扩展方式) { if(扩展方式所达到状态合法) { 修改操作;//根据题意来添加 标记; dfs(); (还原标记); //是否还原标记根据题意 //如果加上(还原标记)就是 回溯法 } } } 对于dfs来说简单的应用有全排列,迷宫问题,或者结合剪枝,回溯,dp等算法;下面我们来介绍其具体应用; 1. dfs全排列问题: #include<iostream> #include<string.h> using namespace std; int a[101],b[101]; int i,j,n; void print() { for(i=1;i<=n;i++) { cout<<a[i]<<" "; } cout<<endl; } void dfs(int i) { if(i==n+1) { print();

结对作业 周杨威、吴原润

ぐ巨炮叔叔 提交于 2019-12-03 14:04:21
一、 代码仓库项目地址 https://github.com/zhouyangwei123/PairingProject 二、 设计历程 拿到任务后,我们首先准备做一款类似于“愤怒的小鸟”的小游戏。但是经过一段时间的尝试,功能实现情况不尽如人意。 这时和一位从事IT工作的朋友天点醒了我“有个词专门形容你们正做的事——Reinventing The Wheel,你们居然不用游戏引擎写游戏?” 我们一直困扰的问题终于迎刃而解——我们为什么觉得每个最简单的操作都举步维艰?为什么觉得自己的作品毫无竞争力(即便说出优点也生硬没有说服力)?因为考虑我们的知识储备,目标本身就不应该是完成一件画面或者操作手感多么优秀的作品,而是应该熟悉软件设计中的每个环节,努力在游戏性上做文章在,退一步说,通过“再造车轮”锻炼编程水平也算是这门课重要的收获。这样我们终于放下包袱,全心投入其中。 这时已经是提交作业前两天的晚上了,我们决定转变思路,做一款横版过关小游戏。结合游戏性考虑,我们最终决定添随机障碍元素,进一步实现随即迷宫。可以用鼠标或者键盘控制人物移动,在不能碰壁的迷宫中寻找出路,人物移动是有惯性作用的,为游戏增加了难度。 三、 需求分析 益智类游戏一直比较受欢迎,比如迷宫——益智又烧脑的小游戏。既然单纯的迷宫经久不衰,那么结合迷宫和动作元素呢?我私下在周围朋友里做了一下调查,答案是肯定的。

bfs---迷宫的最短路径

匿名 (未验证) 提交于 2019-12-03 00:43:02
给定一个大小为N*M的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求出从起点到终点所需的最小步数。请注意,本题假定从起点一定可以移动到终点。N,M小于等于100. 输入 N=10,M=10 #S######.# ......#..# .#.##.##.# .#........ ##.##.#### ....#....# .#######.# ....#..... .####.###. ....#...G# 输出 22 实现代码 #include<iostream> #include<queue> using namespace std; typedef pair<int,int> P; char a[110][110]; //迷宫 int b[110][110]; //到每点的步数 int sx,sy; //起点 int ex,ey; //终点 int n,m; int INF = 100000000; int dx[4] = {1,0,-1,0}; //四个方向 int dy[4] = {0,1,0,-1}; int bfs(int x,int y){ queue<P> que; que.push(P(sx,sy)); //将起点加入队列,并把这一地点的距离设置为0 b[sx][sy] = 0; while(que.size()){ /

广搜遍历迷宫最短路径

匿名 (未验证) 提交于 2019-12-03 00:04:02
开两个二维数组 class node { public : int r ; int c ; node ( ) { } \\ 默认构造函数初始化数组 } ; int d [ max ] [ max ] = { 0 } node p [ max ] [ max ] ; node walk ( node u ) { } ; \\ 用来返回下一个遍历节点; \\ 对于判断条件 d [ i ] [ j ] == 0 \\ 可以走 d [ i ] [ j ] > 0 && d [ i ] [ j ] == - 1 ; \\ 不可以走 \\ 每次成功入队列之后 d [ v . i ] [ v . j ] = d [ u . i ] [ u . j ] + 1 ; pre [ v . r ] [ v . c ] = u ; 来源:51CTO 作者: xbybshd 链接:https://blog.csdn.net/xbybshd/article/details/100805868