博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Maze迷宫问题(求最优解)
阅读量:4316 次
发布时间:2019-06-06

本文共 2719 字,大约阅读时间需要 9 分钟。

迷宫地形我们可以通过读文件的形式,通过已知入口逐个遍历坐标寻找通路。

文件如图:

每个坐标的位置用结构体来记录:

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<

回溯查找通路

利用栈来存储通路,通过上下左右四个方向依次遍历,如果该位置满足条件,就将它入栈,并将该位置的数据置为2;如果四个方向都不满足条件就执行出栈操作,回溯查找满足条件的位置(这时候如果栈为空了,说明查找通路失败),继续循环遍历,直到找到出口为止。

这里建立一个最小栈,如果找到出路,就将该栈赋给最小栈,并将出口置为1,继续回溯查找通路,如果又一次找到通路,就将该栈的长度与最小栈进行比较,如果该栈长度比最小栈还要小,就将它再一次赋给最小栈(保证最小栈是最短的通路),继续回溯,直到整个栈为空,回到了入口,程序结束。

bool SearchMazePath(int *maze, Pos entry, stack
& paths) // 利用栈回溯查找通路,并实现迷宫的最优解{ assert(maze); stack
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;  }

  

 

转载于:https://www.cnblogs.com/Lynn-Zhang/p/5404843.html

你可能感兴趣的文章
牛客练习赛16 E求值
查看>>
matlab rank
查看>>
Asp.net系列--基础篇(三)
查看>>
css基础
查看>>
如何在tomcat中如何部署java EE项目
查看>>
【Python基础教程第2版】——第二讲:列表和元组
查看>>
小常识
查看>>
使用vscode开发python
查看>>
《java编程思想》读书笔记(一)开篇&第五章(1)
查看>>
swift--调用系统单例实现打电话
查看>>
0038-算一算是一年中的第几天
查看>>
51nod 1094 【水题】
查看>>
虚拟机设置静态IP地址
查看>>
Springboot上传文件出现MultipartException
查看>>
NHibernate错误:Could not compile the mapping document的解决
查看>>
关于vue的源码调试
查看>>
003.第一个动画:绘制直线
查看>>
K2BPM怎么让金融数据更有意义?
查看>>
史玉柱自述:我是如何带队伍的
查看>>
靶形数独【贪心+深搜】
查看>>