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 ...
随机推荐
- ios 缩放图片(平铺)
//缩放图片(平铺) - (UIImage *)resizeImage:(NSString *)imgName { UIImage *bgImage = [UIImage imageNamed:im ...
- c#关闭excel进程失败的解决方法
解决方法如下: 1.运行命令dcomcnfg -32,打开组件服务 2.找到execl服务,属性中设置交互式用户 2.设置用户权限 3.设置IIS权限
- 如何验证cname,MX,spf记录是否生效?
创建域名邮箱时,对域名做完相应设置后,在域名邮箱设置里点击“设置完成并提交验证”来等待验证所有权和MX记录设置的正确性.但同时也可以通过下面的方法确认设置是否成功和正确: 一.验证CNAME记录的方法 ...
- github上比較好的开源项目(持续更新)
1:https://github.com/Skykai521/StickerCamera 实现相机功能 实现对图片进行裁剪的功能 图片的滤镜功能 能为图片加入贴纸(贴纸可移动,放大,旋转) 能为图片加 ...
- 好员工去哪儿了:高端IT白领荒胜过春节保姆荒
来自:http://tech.163.com/14/0312/07/9N4BLV8S000915BD.html 于是,你看到的就是这样一幕悖论:一群手握大把工作机会的雇主,在面对一群眼巴巴等待工作机会 ...
- php正則表達式中的非贪婪模式匹配的使用
php正則表達式中的非贪婪模式匹配的使用 通常我们会这么写: $str = "http://www.baidu/.com? url=www.sina.com/"; preg_mat ...
- start with git
Start with git 1.what is GitHub? GitHub is a code hosting platform for version control and collabora ...
- Unity Editor Inspector编辑模板
效果图: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEdito ...
- Lumen开发:结合Redis实现消息队列(1)
1.简介 Lumen队列服务为各种不同的后台队列提供了统一的API.队列允许你推迟耗时任务(例如发送邮件)的执行,从而大幅提高web请求速度. 1.1 配置 .env文件的QUEUE_DRIVER选项 ...
- CAFFE学习笔记(三)在VS2013下生成需要的exe文件
如我们所知,CAFFE_ROOT下有一个文件夹叫tools,里面中有许多cpp文件,它们各自有其不同的功能.但是很显然,当我们要完成某样工作时,我们是不能直接用cpp文件的,只能用exe文件.如何利用 ...