c语言递归算法老鼠走迷宫详解,C++利用递归实现走迷宫

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

要求:

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

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

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

说明:

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

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

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

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

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

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

maze.h

#ifndef _MAZE_H_

#define _MAZE_H_

#include // ifstream

#include

#include

#include

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>

{

for (int col = 0; col<_col>

{

cout << _map[row][col] << " ";

}

cout <

}

cout <

}

// 释放空间

Maze::~Maze()

{

for (int idx = 0; idx < _row; ++idx )

{

delete[] _map[idx];

}

delete[] _map;

_map = NULL;

}

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值