博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
递归解迷宫的问题
阅读量:6292 次
发布时间:2019-06-22

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

hot3.png

        突然兴起递归解决了走迷宫问题,对递归的本质加深了印象,一开始用到了STL的set容器,stl容器是排序容器,如果装载自定义对象的时候需要自定义排序函数,最后选择了用向量vector存储路径,vector有队列的性质。

       解迷宫的递归流程是,检测四个方向是否可走,遇到死路则原路递归返回false,遇到出口则返回true,并将来的路线保存进队列。

#include 
#include 
#include 
#include 
int maze[10][15] = { {1,0,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,1,0,0,0,0,0,0,0,0,0,1}, {1,1,1,0,1,0,1,1,0,1,1,0,1,1,1}, {1,0,0,0,1,0,1,0,0,1,1,0,1,1,1}, {1,0,1,1,1,0,1,1,0,1,1,0,0,0,1}, {1,0,1,1,1,0,1,1,0,1,1,0,1,1,1}, {1,0,0,0,0,0,1,1,0,1,0,0,1,1,1}, {1,1,1,1,1,1,0,0,0,1,1,0,0,0,1}, {1,1,0,0,0,0,0,1,1,0,0,0,1,1,1}, {1,1,1,1,1,1,1,1,1,0,1,1,1,1,1}};#define  UP 1#define  DOWN  2#define  LEFT  3#define  RIGHT 4struct SPoint{ int x; int y;};static int count = 0;//struct Compare{// bool operator() ( const SPoint& p1, const SPoint& p2) const// {//  if (p1.x < p2.x)//  {//   return true;//  }//  else if (p1.x == p2.x)//  {//   if (p1.y < p2.y)//   {//    return true;//   }//  }//  return false;// }//};bool walk(std::vector
& routeVector, int srcDirect, SPoint nowPoint){ count++; // 已在路径中 /*for (std::vector
::iterator it = routeVector.begin(); it != routeVector.end(); ++it) {  if ((*it).x == nowPoint.x && (*it).y == nowPoint.y)  {   return false;  } }*/ // 已到达出口 if (1 == nowPoint.x && 0 == nowPoint.y ) {  routeVector.push_back(nowPoint);  return true; } int nowX = nowPoint.x; int nowY = nowPoint.y; SPoint nextPoint; bool passFlag = false; for(int direct = 1; direct <= 4; ++direct) {  // 排除回头的方向  if (srcDirect == direct)  {   continue;  }  switch(direct)  {  case UP:   {    if (maze[nowY - 1][nowX] == 0)    {     nextPoint.x = nowX;     nextPoint.y = nowY -1;     if(walk(routeVector, DOWN, nextPoint))     {      passFlag = true;     }    }    break;   }  case DOWN:   {    if (maze[nowY + 1][nowX] == 0)    {     nextPoint.x = nowX;     nextPoint.y = nowY +1;     if(walk(routeVector, UP, nextPoint))     {      passFlag = true;     }    }     break;   }  case LEFT:   {    if (maze[nowY][nowX - 1] == 0)    {     nextPoint.x = nowX - 1;     nextPoint.y = nowY;     if(walk(routeVector, RIGHT, nextPoint))     {      passFlag = true;     }    }     break;   }  case RIGHT:   {    if (maze[nowY][nowX + 1] == 0)    {     nextPoint.x = nowX + 1;     nextPoint.y = nowY;     if(walk(routeVector, LEFT, nextPoint))     {      passFlag = true;     }    }     break;   }  default:   break;  } } if (passFlag) {  routeVector.push_back(nowPoint); } return passFlag;}void print_maze(){ for (int raw = 0; raw < 10; ++raw) {  for (int column = 0; column < 15; ++column)  {   if (maze[raw][column] == 1)   {    printf("■");   }   else if(maze[raw][column] == 2)   {    printf("★");   }   else   {    printf("  ");   }    if (column == 14)   {    printf("\n");   }  } }}void paving(std::vector
 routeVec){ for (std::vector
::iterator it = routeVec.begin(); it != routeVec.end(); ++it) {  int raw = (*it).y;  int column = (*it).x;  maze[raw][column] = 2; }}int main(int argc, char* argv[]){ for (int i = 0; i < argc; ++i) {  printf("启动传入的参数: %s \n", argv[i]); } SPoint point; point.x = 9; point.y = 9; SPoint nextPoint; nextPoint.x = 9; nextPoint.y = 8; std::vector
 routeVec; walk(routeVec, DOWN, nextPoint); routeVec.push_back(point); paving(routeVec); print_maze(); printf("递归次数: %d", count); while(true);}

转载于:https://my.oschina.net/JeremyOuyang/blog/422805

你可能感兴趣的文章
不要将时间浪费到编写完美代码上
查看>>
《算法基础:打开算法之门》一3.4 归并排序
查看>>
高德开放平台开放源代码 鼓励开发者创新
查看>>
《高并发Oracle数据库系统的架构与设计》一2.5 索引维护
查看>>
Firefox 是 Pwn2own 2014 上攻陷次数最多的浏览器
查看>>
阿里感悟(十八)- 应届生Review
查看>>
话说模式匹配(5) for表达式中的模式匹配
查看>>
《锋利的SQL(第2版)》——1.7 常用函数
查看>>
jquery中hover()的用法。简单粗暴
查看>>
线程管理(六)等待线程的终结
查看>>
spring boot集成mongodb最简单版
查看>>
DELL EqualLogic PS存储数据恢复全过程整理
查看>>
《Node.js入门经典》一2.3 安装模块
查看>>
《Java 开发从入门到精通》—— 2.5 技术解惑
查看>>
Linux 性能诊断 perf使用指南
查看>>
实操分享:看看小白我如何第一次搭建阿里云windows服务器(Tomcat+Mysql)
查看>>
Sphinx 配置文件说明
查看>>
数据结构实践——顺序表应用
查看>>
python2.7 之centos7 安装 pip, Scrapy
查看>>
机智云开源框架初始化顺序
查看>>