今天最终把昨天下午没写出来的迷宫求是否有通路的cpp写出来了

使用递归实现的,只是算法的质量不怎么样,使用穷举法实现的。

在网上搜了一下,发现还有非常多的更优的算法,哈哈,只是怎么说都是自己一个个地代码敲出来的。

特点是发如今linux以下调试真的有时候自己会崩溃,还好终于还是搞出来了。

哈哈,发上来给类似我这样的的算法新手来一起分享一下;

路径就记录在栈里面,须要得出详细路径的能够小改一下即可了。

findRoad.cpp

//迷宫求解问题思路
//1.用一个矩阵来表示迷宫,即n*m数组
//用穷举法实现;即从入口出发,顺着某一个方向向前探索,若能走通,则继续往前走;
//若到了某一点走不通,则标记该点为不可达
//否则原路返回,换一个方向再继续探索
//详细的请看算法解释
#include <iostream>
using namespace std;
#include "stack.cpp"
struct box{bool status;//用于推断该处是否可通int direct;//用于标记在这里向哪个方向探索过了,//1234分别代表向左上右下的顺序探索,即顺时针方向
};
struct posType//用于记录某一点的坐标值
{int x;int y;
};
bool isEqueal(posType a,posType b)//跟arriived一样,只是名字变了而已
{if(a.x==b.x&&a.y==b.y)return true;return false;}
bool arrived(posType start,posType end)//推断是否已经到达出口
{if(start.x==end.x&&start.y==end.y)return true;return false;};
static mStack<posType> ms;//用于存放经过的路径
const int MAXLINE=5;//须要的时候再改
const int MAXROW=5;
bool findRoad(box (*arr)[MAXROW],posType start,posType end)//注意二维数组的指针表示
{int x=start.x;int y=start.y;if(arrived(start,end))//假设到达return true;//还会有以下这样的情况//应该这样表达才对arr+start.x*MAXROW+start.y)->status//而不是(*arr+i)+jif((*arr+x*MAXROW+y)->status==false)//假设仅剩该点且该点四周都不可达,则路到了尽头!!return false;posType temp;if(ms.isEmpty())  //假设栈空ms.Push(start);       //将当前位置入栈else   //推断是否是上一个点,避免反复入栈{ms.GetTop(temp);if(!isEqueal(temp,start))ms.Push(start);}switch((*arr+x*MAXROW+y)->direct)//检測往哪个方向走过了{//derect=0代表未向不论什么方向探索过,应向左探索//=1代表要向上探索case 0:if(y-1>-1&&(*arr+x*MAXROW+y-1)->status)//向左方探索,假设没有越界而且左方是可达的{//posType newStart(x-1,y);//以左方作为新起点posType newStart;newStart.x=x;newStart.y=y-1;(*arr+x*MAXROW+y)->direct=1;//应该是该点=1;该点探索过了而不是下一点//arr[newStart.x][newStart.y].direct=1;//探索的方向+1findRoad(arr,newStart,end);//以新起点開始探索}else//倘若数组越界了,或者左方不可达,则向上探索{(*arr+x*MAXROW+y)->direct=1;//令其=1,再递归调用findRoad(arr,start,end);//起点不变};break;case 1:if(x-1>-1&&(*arr+(x-1)*MAXROW+y)->status)//向上方探索,假设没有越界而且上方是可达的{
//                  posType newStart(x,y-1);//以该起点作为新点posType newStart;newStart.x=x-1;newStart.y=y;(*arr+x*MAXROW+y)->direct=2;//应该是该点=1;该点探索过了而不是下一点//arr[newStart.x][newStart.y].direct=2;//探索的方向=2findRoad(arr,newStart,end);//以新起点開始探索}else//倘若数组越界了,则向上探索{(*arr+x*MAXROW+y)->direct=2;//令其=2,再递归调用,即指示其向下一个方向探索findRoad(arr,start,end);//起点不变};break;case 2:    if(y+1<MAXROW&&(*arr+x*MAXROW+y+1)->status)//向右方探索,假设没有越界而且右方是可达的{//posType newStart(x+1,y);//以该起点作为新点posType newStart;
//                  newStart.x=x+1;newStart.x=x;//向右应该是y+1newStart.y=y+1;(*arr+x*MAXROW+y)->direct=3;//arr[newStart.x][newStart.y].direct=3;//探索的方向=3findRoad(arr,newStart,end);//以新起点開始探索}else//倘若数组越界了或者不可达,则向下探索{(*arr+x*MAXROW+y)->direct=3;//令其=3,再递归调用,即指示其向下一个方向探索findRoad(arr,start,end);//起点不变};break;case 3:   if(x+1<MAXLINE&&(*arr+(x+1)*MAXROW+y)->status)//向下方探索,假设没有越界而且下方是可达的{//posType newStart(x,y+1);//以该起点作为新点posType newStart;newStart.x=x+1;newStart.y=y;(*arr+x*MAXROW+y)->direct=4;//arr[newStart.x][newStart.y].direct=4;//探索的方向=3findRoad(arr,newStart,end);//以新起点開始探索}else//倘若数组越界了或者不可达,更改此点为不可达{(*arr+x*MAXROW+y)->direct=4;//令其=3,再递归调用,即指示其向下一个方向探索findRoad(arr,start,end);//起点不变};break;case 4:    (*arr+x*MAXROW+y)->status=false;//当四个方向都探索完了之后,均没有通路时,标记该点为不可达状态posType t;//将当前点出栈ms.Pop(t);//if(ms.isEmpty())//假设此时栈已经空了,说明没有路能够回头了,路不通return false;ms.Pop(start);//令上一路径为起点,递归找路findRoad(arr,start,end);break;};
};

stack.cpp

//用于实现栈的操作
#include <iostream>
using namespace std;
//const int MAX=100;//栈最大长度值为100,用数组实现栈
//写成模板类是为了方便我以后使用
template <class T>
class mStack{private:enum {MAX=1000};T arr[MAX];int Size;int top;//用于指示栈顶位置public:mStack(  )//构建空栈{top=-1;//下标为-1则为空栈Size=0;}bool isEmpty(){return top==-1;}bool isFull(){return top==MAX-1;}bool Push(T &item){if(isFull()){cout<<"stack is full!"<<endl;return false;}//++top;//arr[++top]=item;arr[++top]=item;//由于下标从-1開始,使用前+1//cout<<"this "<<top<<" item push values is :"<<arr[top]<<endl;Size++;return true;}bool Pop(T &item){if(isEmpty()){cout<<"stack is empty!"<<endl;return false;}item=arr[top--];//由于下标从-1開始,top指向当前最后一个元素,使用后-1//cout<<"this "<<top<<" item pop values is :"<<arr[top]<<endl;Size--;return true;}bool GetTop(T &item){if(!isEmpty()){item=arr[top];return true;}            return false;}int size(){return Size;}};

test.cpp

#include <fstream>
#include <cstdlib>
#include <ctime>
#include "all.cpp"
const int MAXL=5;
const int MAXR=5;int main()
{ofstream fout;//("test1.txt");//,ios_base::app);//,ios_base::app);fout.open("test1.txt",ios_base::app);if(!fout.is_open())cerr<<"open failer!"<<endl;//box (*b)[MAXR];box (*b)[MAXR]=new box[MAXL][MAXR];ifstream fin("tx.txt");//从文件里读取迷宫if(!fin.is_open())cerr<<"fin open failure!"<<endl;for(int i=0;i<MAXLINE;i++){for(int j=0;j<MAXROW;j++){int num;fin>>num;//*(*(b+i)+j)=new box;if(num==1)(*(b+i)+j)->status=false;//给迷宫里的box赋值//(*(ar+i)+j)->status=false;else(*(b+i)+j)->status=true;(*(b+i)+j)->direct=0;}}fin.close();posType start;start.x=0;start.y=1;posType end;end.x=0;end.y=3;(*(b+start.x)+(start.y))->status=true;(*(b+end.x)+end.y)->status=true;for(int i=0;i<MAXLINE;i++){for(int j=0;j<MAXROW;j++){if((*(b+i)+j)->status)fout<<"0 ";elsefout<<"1 ";}    fout<<endl;}  fout<<endl<<endl;fout.close();  if(findRoad(b,start,end))cout<<"has load!"<<endl;elsecout<<"no load "<<endl;    }

tx.txt

//能够自己设置迷宫路径和出发点以及出口

1 0 1 0 1
0 0 1 0 0
0 0 1 0 0
0 0 1 0 1
1 0 0 0 0

转载于:https://www.cnblogs.com/gcczhongduan/p/4271932.html

用递归实现求一个迷宫是否有通路相关推荐

  1. MATLAB用递归法求解集合子集,用递归法求一个集合的子集c语言,急!!!

    匿名用户 1级 2014-04-09 回答 给你个参考代码: #include <stdio.h> #define ARRAY_SIZE 5 //输出Buffer集合 void Outpu ...

  2. 三目运算法求一个大值,以及指定位数的应用,以及函数的声明,以及函数的嵌套,以及函数的递归,以及用递归法求阶乘

    1.三目运算法 首先一般方法比较两个数的大小 用空格和回车都一样 当结果非x即y的时候 我们可以用三目运算法 z=x>y?x:y 如果表达式成立取前面的值,如果表达式不成立取后面的值 也可以改成 ...

  3. 递归 算例一(求一个简单嵌套字典的深度)

    递归 算例一(求一个简单嵌套字典的深度) c=[]def dcc(dic):for key in dic.keys():print (key) c.append(key) vv=dic[key]#判断 ...

  4. 尾调用优化 java_基于Java8函数式编程求一个List的全部子集|尾调用优化解决递归性能问题...

    目录 基于函数式编程求一个List的全部子集 代码来自<Java8 in Action>,思路和其他递归解决方法一致,但不同的地方在concat方法 public static List& ...

  5. 求一个矩阵的鞍点(即在行上最小而在列上最大的值)(C++编写)(循环与递归)

    算法经典题型1 求一个矩阵的鞍点(即在行上最小而在列上最大的值) 用到的算法 思想是 -循环与递归 博主用到的环境:Win7, CodeBlocks等. 一.代码 #include <iostr ...

  6. 编写程序C语言 用递归法求n,用C语言编写一个递归程序用来计算:1*2+2*3+3*4+.+(n-1)*n...

    用C语言编写一个递归程序用来计算:1*2+2*3+3*4+.+(n-1)*n以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧 ...

  7. 用递归求最大值PHP,php如何使用递归来计算一个目录中所有文件的大小(代码)...

    本篇文章给大家带来的内容是关于php如何使用递归来计算一个目录中所有文件的大小 (代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助.sudo find /private/etc - ...

  8. 零基础学Python———求一个字符串的每个字符重新组合排列python排列组合的数学运算(递归法)

    1.数学知识温习 全排列的公式为: Anm:A _n^m : Anm​: 以 " AABBCC " 为例,全排列的公式有: A66=6!:A _6^6 = 6! : A66​=6! ...

  9. python用一行代码画个迷宫_用 Python 制作一个迷宫游戏

    相信大家都玩过迷宫的游戏,对于简单的迷宫,我们可以一眼就看出通路,但是对于复杂的迷宫,可能要仔细寻找好久,甚至耗费数天,然后可能还要分别从入口和出口两头寻找才能找的到通路,甚至也可能找不到通路. 虽然 ...

  10. delphi dbgrideh 遍历每一个单元格_真香!我用Python 制作了一个迷宫游戏

    相信大家都玩过迷宫的游戏,对于简单的迷宫,我们可以一眼就看出通路,但是对于复杂的迷宫,可能要仔细寻找好久,甚至耗费数天,然后可能还要分别从入口和出口两头寻找才能找的到通路,甚至也可能找不到通路. 虽然 ...

最新文章

  1. springboot 优雅停机_Spring Boot 2.3 新特性优雅停机详解
  2. tensorflow 线性回归
  3. Oracle存储过程中异常Exception的捕捉和处理
  4. Android中Preference的使用以及监听事件分析
  5. wxWidgets:wxDataViewEvent类用法
  6. C++统计10亿以内所有的质素(素数)的实现算法(附完整源码)
  7. javax.naming.NameNotFoundException:
  8. mysql业务 日志_mysql笔记之日志篇
  9. 分治应用--万里挑一 找假硬币
  10. mybatis 插入数据后返回自增id
  11. RedHat系列软件管理(第二版) --二进制软件包管理
  12. Linux学习13-CentOS安装ab做压力测试
  13. Spring Cloud Hystrix - 服务容错
  14. struts教程笔记3
  15. 在计算机硬盘使用前需要做的工作是,工作电脑的硬盘该如何保养
  16. 阿里云大数据ACA总结
  17. 【问题记录】怎么用python读取CIFAR10数据集?
  18. linux下利用MP4v2封装H264 aac为mp4
  19. 黑马JavaWeb全功能综合案例(element-ui+mybatis+Vue+ajax)
  20. 建模语言UML在软件开发中的应用

热门文章

  1. selenium 自动化web测试
  2. 帮助类之自动解析表达式判定结果方法类
  3. 系统缓存全解析2:页面输出缓存
  4. java类型强转会有性能消耗吗_Java代码性能优化总结(转)
  5. app登录界面背景 css_Google flutter这么火?撸一个APP登录界面(上)
  6. java自定义日志_java-自定义日志记录以在运行时收集消息
  7. Vector3.MoveTowards与Vector3.Lerp()区别
  8. 【图文教程】Windows给Rabbitmq安装rabbitmq_delayed_meaage_exchange
  9. 数据库与表的操作之SQL Server 2012中的数据类型
  10. 【渝粤教育】国家开放大学2018年秋季 2720T实用管理基础 参考试题