C++利用递归实现走迷宫

所属分类: 软件编程 / C 语言 阅读数: 94
收藏 0 赞 0 分享

本文实例为大家分享了C++利用递归实现走迷宫的具体代码,供大家参考,具体内容如下

要求:

1、将地图的数组保存在文件中,从文件中读取行列数

2.、动态开辟空间保存地图

3.、运行结束后再地图上标出具体的走法

说明:

1、文件中第一行分别放置的是地图的行数和列数

2、其中1表示墙,即路不通,0表示路,即通路

3、程序运行结束后用2标记走过的路径

4、当走到“死胡同”时用3标记此路为死路

5、每到一个点,按照 左 上 右 下 的顺序去试探

6、没有处理入口就是"死胡同"的极端情况

maze.h

#ifndef _MAZE_H_
#define _MAZE_H_
#include <fstream> // ifstream
#include <iostream>
#include <cassert>
#include <string>
using namespace std;
 
// 坐标类
class Seat
{
public:
 Seat(int _x, int _y)
 :x(_x)
 ,y(_y)
 { }
 int x;
 int y;
};
 
// 迷宫类
 
class Maze
{
private:
 int** _map; // 指向地图的指针
 int _row; // 存放地图的行数
 int _col; // 存放地图的列数
public:
 // 构造函数 读取文件里的地图 和行数
 Maze(const string& filePath);
 
private:
 // 判断是否是路
 bool IsPass(Seat& entry);
 
public:
 // 开始走
 bool PassMaze( Seat& entry);
 
 // 打印地图
 void PrintMap();
 
 // 析构 释放空间
 ~Maze();
};
 
 
#endif

maze.cpp

// 递归实现迷宫
#include "maze.h"
 
// 判断是否是路
bool Maze::IsPass( Seat& Entry)
{
 if (_map[Entry.x][Entry.y] == 0)
 {
 return true;
 }
 return false;
}
 
// 构造函数 读取文件里的地图 和行数
Maze::Maze(const string& filePath )
{
 ifstream read(filePath);
 string str_row_col, str_temp;
 // 读取第一行
 getline(read, str_row_col);
 // 获取行
 str_temp = str_row_col.substr(0, str_row_col.find_first_of(','));
 _row = atoi(str_temp.c_str());
 // 获取列
 str_temp = str_row_col.substr( str_row_col.find_first_of(',')+1);
 _col = atoi(str_temp.c_str());
 
 // 为地图分配空间
 _map = new int*[_row];
 for (int index = 0; index < _col; ++index)
 {
 _map[index] = new int[_col];
 }
 
 int index_col = 0;
 int index_row = 0;
 // 填充地图
 while (!read.eof())
 {
 // 获取一行
 getline(read, str_temp);
 char * line = (char*)str_temp.c_str();
 while ((*line) != '\0')
 {
 if (*line == '0' || *line == '1')
 {
 _map[index_row][index_col++] = *line - '0';
 }
 ++line;
 }
 ++index_row;
 index_col = 0;
 }
 
 // 关闭文件
 read.close();
}
 
// 开始走
bool Maze::PassMaze( Seat& Entry)
{
 // 判断是否走到出口
 if (Entry.x < 0 || Entry.y < 0 || Entry.y >=_row)
 {
 return true;
 }
 
 if (IsPass(Entry))
 {
 // 将走过的路置为2
 _map[Entry.x][Entry.y] = 2;
 
 // 向左走
 Seat left(Entry.x, Entry.y-1);
 if (PassMaze(left))// 递归调用
 {
 return true;
 }
 
 // 向上走
 Seat up(Entry.x-1, Entry.y);
 if (PassMaze(up)) // 递归调用
 {
 return true;
 }
 
 // 向右走
 Seat right(Entry.x, Entry.y+1);
 if (PassMaze(right)) // 递归调用
 {
 return true;
 }
 
 // 向下走
 Seat down(Entry.x+1, Entry.y);
 if (PassMaze(down))
 {
 return true;
 }
 
 // 走到此处说明是死路 置为3
 _map[Entry.x][Entry.y] = 3;
 
 }
 
 return false;
}
 
// 打印地图
void Maze::PrintMap()
{
 for (int row = 0; row<_row; ++row)
 {
 for (int col = 0; col<_col; ++col)
 {
 cout << _map[row][col] << " ";
 }
 cout <<endl;
 }
 cout <<endl;
}
 
// 释放空间
Maze::~Maze()
{
 for (int idx = 0; idx < _row; ++idx )
 {
 delete[] _map[idx];
 }
 delete[] _map;
 _map = NULL;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

利用C语言来求最大连续子序列乘积的方法

这篇文章主要介绍了利用C语言来求最大连续子序列乘积的方法,基本的思路以外文中还附有相关ACM题目,需要的朋友可以参考下
收藏 0 赞 0 分享

用C语言判断一个二叉树是否为另一个的子结构

这篇文章主要介绍了用C语言判断一个二叉树是否为另一个的子结构,是数据结构学习当中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现的阶乘,排列和组合实例

这篇文章主要介绍了C语言实现的阶乘,排列和组合的方法,涉及C语言数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言查找数组里数字重复次数的方法

这篇文章主要介绍了C语言查找数组里数字重复次数的方法,涉及C语言针对数组的遍历与判断技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言简单实现计算字符个数的方法

这篇文章主要介绍了C语言简单实现计算字符个数的方法,涉及C语言针对字符串的简单遍历与判定技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

c实现linux下的数据库备份

本文给大家简单介绍下c实现linux下的数据库备份的方法和具体的源码,十分的实用,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

C++获得文件状态信息的方法

这篇文章主要介绍了C++获得文件状态信息的方法,包括文件状态信息、文件所在磁盘盘符、文件创建时间、访问时间及修改日期等,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言按关键字搜索文件夹中文件的方法

这篇文章主要介绍了C语言按关键字搜索文件夹中文件的方法,涉及C语言文件操作及字符串查找的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言之字符串模糊查询方法的实现

本篇文章主要为大家介绍字符串模糊查询的C语言程序编写方法,有需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现BMP转换JPG的方法

这篇文章主要介绍了C语言实现BMP转换JPG的方法,涉及C#图片格式转换的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多