Maze迷宫问题(求最优解)
迷宫地形我们可以通过读文件的形式,通过已知入口逐个遍历坐标寻找通路。
文件如图:

每个坐标的位置用结构体来记录:
struct Pos //位置坐标
{
int _row;
int _col;
};
定义行列范围:
#define M 10 //行
#define N 10 //列
初始化迷宫数组:
将通过读文件的方式获取的字符转成整型数据,保存在M行N列的数组中。
void InitMaze(int* maze)
{
struct WavHeadhWAV;
FILE* fout = fopen("MazeMap.txt", "r"); // .txt文件要放在当前目录下
if (fout == NULL) // 这里一定要检查读文件是否成功
{
cout << "can't find MazeMap.txt !" << endl<<endl;
return;
}
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N;)
{
char ch = fgetc(fout);
if (ch=='1'||ch=='0')
{
maze[i*N + j] = ch - '0';
j++;
}
}
}
fclose(fout);
}
回溯查找通路:
利用栈来存储通路,通过上下左右四个方向依次遍历,如果该位置满足条件,就将它入栈,并将该位置的数据置为2;如果四个方向都不满足条件就执行出栈操作,回溯查找满足条件的位置(这时候如果栈为空了,说明查找通路失败),继续循环遍历,直到找到出口为止。
这里建立一个最小栈,如果找到出路,就将该栈赋给最小栈,并将出口置为1,继续回溯查找通路,如果又一次找到通路,就将该栈的长度与最小栈进行比较,如果该栈长度比最小栈还要小,就将它再一次赋给最小栈(保证最小栈是最短的通路),继续回溯,直到整个栈为空,回到了入口,程序结束。
bool SearchMazePath(int *maze, Pos entry, stack<Pos>& paths) // 利用栈回溯查找通路,并实现迷宫的最优解
{
assert(maze);
stack<Pos>min;
paths.push(entry);
while (!paths.empty())
{
Pos cur = paths.top();
maze[cur._row*N+cur._col] = 2;
if (cur._row==M-1)
{
if (paths.size()< min.size() || min.size() == 0)
{
min = paths;
}
paths.pop();
maze[min.top()._row*N + min.top()._col] = 1;
}
Pos next = cur;
next._col--; //左
if (CheckIsAccess(maze, next))
{
paths.push(next);
maze[next._row*N + next._col] = 2;
continue;
}
next = cur;
next._col++; //右
if (CheckIsAccess(maze, next))
{
paths.push(next);
maze[next._row*N + next._col] = 2;
continue;
}
next = cur;
next._row--; //上
if (CheckIsAccess(maze, next))
{
paths.push(next);
maze[next._row*N + next._col] = 2;
continue;
}
next = cur;
next._row++; //下
if (CheckIsAccess(maze, next))
{
paths.push(next);
maze[next._row*N + next._col] = 2;
continue;
}
paths.pop();
}
if (paths.empty()&&!min.empty())
{
maze[min.top()._row*N + min.top()._col] = 2;
return true;
}
return false;
}
检查该位置是否合法:(坐标在行列范围之内)
bool CheckIsAccess(int* maze, const Pos& next) // 检查该位置是否合法
{
assert(maze);
if ((next._row >= 0 && next._row <= N) && (next._col >= 0 && next._col < M) && maze[next._row*N + next._col] == 0)
{
return true;
}
return false;
}
打印迷宫:
void PrintMaze(int *maze) // 打印迷宫
{
assert(maze);
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
cout << maze[i*N + j] <<" " ;
}
cout << endl;
}
cout << endl;
}
Maze迷宫问题(求最优解)的更多相关文章
- 【南京邮电】maze 迷宫解法
[南京邮电]maze 迷宫解法 题目来源:南京邮电大学网络攻防训练平台. 题目下载地址:https://pan.baidu.com/s/1i5gLzIt (密码rijss) 0x0 初步分析 题目中给 ...
- [LeetCode] The Maze 迷宫
There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...
- hdu4035 Maze (树上dp求期望)
dp求期望的题. 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) 2.找到出口,走出迷宫 ...
- [LeetCode] 490. The Maze 迷宫
There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...
- 利用C语言判定用户输入数据从而给出结果(利用判定用户体重范围)同求最优解!!!
例子: 要求:医务工作者通过广泛的调查和统计分析,根据成人的身高与体重因素给出了按"体质指数"进行判断的方法,具体如下: 体质指数t=体重 w/(身高h)2(w的单位为kg,h的单 ...
- Lagrange 乘子法求最优解
clc clear syms x y z r1 r2 w f=x^+y^+z^+w^; g1=*x-y+z-w-; g2=x+y-z+w-; h=f-r1*g1 -r2*g2; hx=diff(h,x ...
- Atcoder Beginner Contest151D(迷宫问题求任意两点最短路径的最大值,BFS)
BFS可以求得最短路,DFS会找到从当前点到图中叶子结点的路径. #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using na ...
- 石子合并2(环形求最优解 区间dp)
题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
- [LeetCode] 499. The Maze III 迷宫 III
There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...
随机推荐
- Git常用统计命令
上周要做个汇报PPT涉及到个人对项目贡献量,在网上搜集了些常用统计命令,总结如下: 1.统计代码提交量(包括添加.删除): git log --author="$(gitconfig--ge ...
- C# string[ ][ ] 与string[,]
1.string[][] 是一维数组,数组中的元素是string[],相当于锯齿数组 例如:string[][] arrar = new string[][] { n ...
- java之CGLIB动态代理
© 版权声明:本文为博主原创文章,转载请注明出处 CGLIB动态代理: CGLIB动态代理就是对指定的类生成一个子类,覆盖其中所有的方法并环绕增强 优势: - 1. 业务类只需要关注业务逻辑本身,保证 ...
- PyQt5 Function Parameter Declaration
addWidget self.lcd = QLCDNumber() grid.addWidget(self.lcd,0,0,3,0) grid.setSpacing(10) void QGridLay ...
- (二)spark算子 分为3大类
transgormation的算子对key-value类型的数据有三种: (1)输入 与 输出为一对一关系 mapValue();针对key-value类型的数据并只对其中的value进行操作,不对 ...
- 详细的obs操作教程(windows/mac)图解
直播推流软件obs操作配置教程包含支持mac和windows配置 1 2 3 4 5 6 7 8 9
- vim与windows/linux之间的复制粘贴小结
vim与windows/linux之间的复制粘贴小结 用 vim这么久了,始终也不知道怎么在vim中使用系统粘贴板,通常要在网上复制一段代码都是先gedit打开文件,中键粘贴后关闭,然后再用vim打开 ...
- spring download
http://maven.springframework.org/release/org/springframework/spring/
- java 对象占用内存查看 以及JVM级别 方法修改等
public interface Instrumentation 此类提供检测 Java 编程语言代码所需的服务.检测是向方法中添加字节码,以搜集各种工具所使用的数据.由于更改完全是进行添加,所以这些 ...
- poj 2524 Ubiquitous Religions(并查集)
Ubiquitous Religions Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 23168 Accepted: ...