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

本文实例为大家分享了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;
}

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

(0)

相关推荐

  • C++自动生成迷宫游戏

    本文实例为大家分享了C++实现迷宫游戏的具体代码,供大家参考,具体内容如下 运用并查集自动生成迷宫地图,并运用队列和栈寻找迷宫通路并打印出来 #include<stdlib.h> #include<iostream> #include<time.h> #include<queue> #include<stack> using namespace std; using std::queue; using std::stack; typedef st

  • C++迷宫问题的求解算法

    本文实例为大家分享了C++实现迷宫的具体代码,供大家参考,具体内容如下 一. 实验目的: (1) 熟练掌握链栈的基本操作及应用. (2) 利用链表作为栈的存储结构,设计实现一个求解迷宫的非递归程序. 二.实验内容: [问题描述] 以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.设计一个程序,对信任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论. [基本要求] 首先实现一个链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序.求得的通路以三元组(i,j,d)的形

  • C++实现迷宫小游戏

    介绍 本程序是根据广度优先遍历算法的思想设计的一款迷宫游戏,游戏设计了两种模式一种自动游戏模式,一种手动模式.因为项目在 Linux 开发,需要在 Windows 开发的,请查看源代码中需要修改地方的备注. 截图 代码 #include <iostream> #include <cstdlib> //标准库 #include <unistd.h> //延时函数 #include <stdio.h> //getchar #include <ctime&g

  • C++随机生成迷宫算法

    本文实例为大家分享了C++随机生成迷宫的具体代码,供大家参考,具体内容如下 我们今天来做一个迷宫游戏.在其中有几个要领: 1.方向的控制 我们建立的迷宫是以坐标的形式出现的,越往上x坐标越小,越往左y坐标越小,这雨平面直角坐标系不同,要注意! 2.随机生成算法: void init_maze(void); //初始化迷宫 void gotoxy(int x, int y); //移动光标 void path_up(int *x, int *y); //上构路径 void path_down(in

  • C++实现迷宫游戏

    本文实例为大家分享了C++实现迷宫游戏的具体代码,供大家参考,具体内容如下 #include<iostream> using namespace std; //点为2表示迷宫图为"█",点为0表示迷宫图为" " int migo[9][9]= { {2, 2, 2, 2, 2, 2, 2, 2, 2}, {2, 0, 0, 0, 0, 0, 0, 0, 2}, {2, 0, 2, 2, 0, 2, 2, 0, 2}, {2, 0, 2, 0, 0, 2,

  • C++利用循环和栈实现走迷宫

    本文实例为大家分享了C++利用循环和栈实现走迷宫的具体代码,供大家参考,具体内容如下 要求: 1.将地图的数组保存在文件中,从文件中读取行列数 2..动态开辟空间保存地图 3..运行结束后再地图上标出具体的走法 说明: 1.文件中第一行分别放置的是地图的行数和列数 2.其中1表示墙,即路不通,0表示路,即通路 3.程序运行结束后用2标记走过的路径 4.当走到"死胡同"时用3标记此路为死路 5.每到一个点,按照 左 上 右 下 的顺序去试探 6.没有处理入口就是"死胡同&quo

  • C++迷宫的实现代码

    本文实例为大家分享了C++实现迷宫游戏的具体代码,供大家参考,具体内容如下 //文件的输入,有墙 #include<iostream> #include<ctime> #include<cstdlib> #include<fstream> using namespace std; const int max1=100*100; //加入墙 const int max2=102; bool value[max2][max2]; //记录是否被访问过 int m

  • C++基于prim实现迷宫生成

    本文实例为大家分享了C++实现迷宫生成的具体代码,供大家参考,具体内容如下 只用到了c++中的vector,其余的和纯C差别不大,纯C可能需要手动弄一个vector太繁琐了不太想弄. 看了迷宫的一些算法,prim还是比较好看的,网上的代码python c#居多,而且不太容易搞懂,那我在这里用C++(大部分C)实现了这个目的 prim算法:随机Prim算法生成的迷宫岔路较多,整体上较为自然而又复杂,算法核心为(根据维基百科). 1.让迷宫全是墙. 2.选一个单元格作为迷宫的通路(我一般选择起点),

  • 迷宫游戏控制台版C++代码

    本文实例分享了C++设计的一个可以调整大小的迷宫游戏,给定迷宫的入口.如果存在出口,程序能够显示行走的路径,并最终到达出口,并输出"成功走出迷宫":如果不存在出口,程序也能够显示行走的过程,并最终回退到入口,并输出"回退到入口". //这是一个迷宫游戏 #include<iostream> #include<ctime> #include<cstdlib>/*用于生成随机数,形成随机变化的迷宫*/ #include<ioma

  • C++控制台实现随机生成路径迷宫游戏

    本程序是在控制台下随机生成迷宫路径的一个C++程序,可以通过修改宏定义 M 和 N 的值来修改迷宫的长度和宽度,运行程序后 按1开始游戏 按2退出游戏,游戏入口在左上角,出口在右下角,人物(星星)到达右下角出口提示成功闯关. #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> #include<iostream.h> #include<ctime

  • C++实现简单走迷宫的代码

    本文实例为大家分享了C++实现走迷宫的具体代码,供大家参考,具体内容如下 用n*n个小方格代表迷宫,每个方格上有一个字符0或1,0代表这个格子不能走,1代表这个格子可以走.只能一个格子一个走,而且只能从一个格子向它的上.下.左.右四个方向走,且不能重复.迷宫的入口和出口分别位于左上角和右下角,存在唯一的一条路径能够从入口到达出口,试着找出这条路径. 例如,下图是一个迷宫,红色表示走出迷宫的一条路径 输入:入口坐标(startX,startY),出口坐标(endX,endY) 输出:如果存在这样一

随机推荐