递归解迷宫的问题

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

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

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
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 4
struct 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<SPoint>& routeVector, int srcDirect, SPoint nowPoint)
{
 count++;
 // 已在路径中
 /*for (std::vector<SPoint>::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<SPoint> routeVec)
{
 for (std::vector<SPoint>::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<SPoint> routeVec;
 walk(routeVec, DOWN, nextPoint);
 routeVec.push_back(point);
 paving(routeVec);
 print_maze();
 printf("递归次数: %d", count);
 while(true);
}
时间: 2025-01-05 19:29:12

递归解迷宫的问题的相关文章

每日一小练——数值自乘非递归解

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:数值自乘非递归解 内容: 连续求m^n问题(m与n是正整数).前面的提示会得到一个递归程序,请编写一个运算效率同样高的非递归的程序. 我的解法:上来没多想,打开vs2013就敲了起来,问题果然很简单,分分钟就超神..奥,不对就解决了!如果是非递归其实一种简单的方法就是把, 递归的几种分类做好if分支,用一个循环处理就好了,不过如果我们认真思考m^n这个式子,我们会发现n如果用二进制表示的话如:2^7可改写为 2^011

每日一小练——数值自乘递归解

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:数值自乘递归解 内容:如果一个n与m是正整数,那么m^n就是把m连乘n次,这是一个很没有效率的方法.试试编写一个更有效率的程序,应该以少量n-1个乘法作为设计标准. 我的解法:上来没多想,打开vs2013就敲了起来,问题果然很简单,分分钟就超神..奥,不对就解决了!解决递归的问题,其实关键在于找到合理的递归公式,公式只要找到问题就迎刃而解了.这个题目说的是自乘,所以底数是不变的,指数上无非就3中情况,奇数,偶数和零.奇

递归解Codeforces Round #256 (Div. 2)C. Painting Fence

#include<iostream> #include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector> #include<algorithm> using namespace std; in

python递归解压文件夹中所有压缩包

1. 简述 递归解压文件夹中的所有压缩包到指定文件夹 2. 环境配置 python解压rar文件需要安装依赖库 (python-unrar) Windows: 在 RARLab 官方下载安装库文件 http://www.rarlab.com/rar/UnRARDLL.exe 默认路径伪 C:\Program Files (x86)\UnrarDLL\ 添加环境变量 UNRAR_LIB_PATH 键值 C:\Program Files (x86)\UnrarDLL\x64\UnRAR64.dll,

Java数据结构之回溯算法的递归应用迷宫的路径问题

一.简介 回溯法的基本思想是:对一个包括有很多结点,每个结点有若干个搜索分支的问题,把原问题分解为对若干个子问题求解的算法.当搜索到某个结点.发现无法再继续搜索下去时,就让搜索过程回溯(即退回)到该结点的前一结点,继续搜索这个结点的其他尚未搜索过的分支:如果发现这个结点也无法再继续搜索下去时,就让搜索过程回溯到这个结点的前一结点继续这样的搜索过程:这样的搜索过程一直进行到搜索到问题的解或搜索完了全部可搜索分支没有解存在为止. 该方法可以使用堆栈实现.也可以使用递归实现,递归实现的话代码比较简单,

学习日志---递归、非递归,迷宫问题

递归算法的设计方法: 适宜于用递归算法求解的问题的充分必要条件是: (1)问题具有某种可借用的类同自身的子问题描述的性质    (2)某一有限步的子问题(也称作本原问题)有直接的解存在.当一个问题存在上述两个基本要素时,设计该问题的递归算法的方法是:   (1)把对原问题的求解表示成对子问题求解的形式.   (2)设计递归出口. 阶乘: import java.util.Scanner; public class JieChengDemo {     public static long jie

数据结构基础 背包问题(一) 之 非递归解

[问题描述] "背包题目"的基本描述是:有一个背包,能盛放的物品总重量为S,设有N件物品,其重量分别为w1,w2,-,wn,希望从N件物品中选择若干物品,所选物品的重量之和恰能放进该背包,即所选物品的重量之和即是S.递归和非递归解法都能,试非递归算法求得"背包题目"的一组解 [算法分析] 1.此程序是得到问题的所有解: 2.本题只对背包有重量约束: 3.算法思想(暴力枚举) 1)初始化flag数组,数组长度为背包数目 n,数组为全 0 序列,0,1表示是否添加第 i

广度优先搜索[再解迷宫]

上一节讲过深度优先搜索解决迷宫,http://blog.csdn.net/wtyvhreal/article/details/43268115 这一节讲解广度优先搜索解决迷宫. 广度优先搜索(Breadth First Search,BFS),也称为宽度优先搜索. 还是二维数组存储,开始小哼在(1,1)处,在深搜里我们先让小哼往右边走,然后一直尝试下去,直到走不通的时候再回到这里.这样是深搜,可以通过函数递归实现.广搜的方法:通过一层一层扩展的方法找到小哈.扩张的时候每发现一个点就将这个点加入到

递归解压压缩包_模块更新(需要下载对应的解压程序)

1 #!/usr/bin/python3 2 # -*-coding:utf-8-*- 3 import os 4 import shutil 5 import time 6 import sys 7 import subprocess 8 sys.setrecursionlimit(10000)#设置函数递归的最大深度,防止无限递归导致堆栈溢出和系统崩溃 9 10 class UnzipLogFile: 11 parentName = "D:\广东应急厅巡检日志" 12 def __