题目
初步设计思路
准备采用堆栈的方法实现。
创建了3个抽象类,分别完成目的。 这里放上类图
Maze类: 用于初始化迷宫(目前是完成题目前半段,之间用固定数组)
Mouse类: 老鼠类实现方法
Stack: 普通的堆栈
实现代码
因为有注释就不写实现思路了。
// Maze.h
#pragma once
#include<iostream>
using namespace std;
class Maze
{
public:
Maze(int (*ms)[9]); //定义的动态将数值改为变量即可以自定义迷宫
void display(); //地图打印
~Maze();
int** MazeSpace; //数组第一维为列,第二维为行
};
//Stack.h
class Stack
{
public:
Stack(int size = 10) ; //堆栈初始化
~Stack();
void push(int p); //push数据
int pop(); //pop数据
int top()const; //得到最外面的数据
bool full()const { return this->mtop == this->msize - 1; }
bool empty()const { return this->mtop == -1; }
private:
int* mpStack; // 存放栈的元素
int mtop; // 栈顶指针
int msize; // 栈的总长度
void resize() //stack的动态扩容函数要私有化
{
int* ptemp = new int[msize * 2];
for (int i = mtop; i >= 0; i--)
{
ptemp[i] = mpStack[i];
}
delete[]mpStack;
mpStack = ptemp;
msize *= 2;
}
};
//Mouse.h
#pragma once
#include"Maze.h"
#include"Stack.h"
class Mouse
{
public:
Mouse(int(*ms)[9]);
void findMazePath(); //找路
void display(); //显示地图
void showPath(); //显示老鼠走过的路径
private:
const int RIGHT = 0;
const int DOWN = 1;
const int LEFT = 2;
const int UP = 3;
Maze maze;
Stack s;
};
//Maze.cpp
#include "Maze.h"
//采用了动态数组,在此题之后如果需要可以更改迷宫的格式
Maze::Maze(int (*ms)[9]) {
MazeSpace = new int * [9]; //开辟一维数组
for (int i = 0; i < 9; ++i)
{
MazeSpace[i] = new int[9]; //在一维的基础上再开辟二维
}
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
MazeSpace[i][j] = ms[i][j];
}
}
}
//改成自定义迷宫时只需将数值改为传入数组的大小即可
void Maze::display()
{
cout << "迷宫的图形为" << endl;
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (MazeSpace[i][j] == 1) {
cout << "█";
}
else
{
cout << " ";
}
}
cout << endl;
}
}
Maze::~Maze() {
for (int i = 0; i < 9; i++)
{
delete[] MazeSpace[i];
}
delete[] MazeSpace;
}
//Stack.cpp
#include "Stack.h"
//堆栈初始化
Stack::Stack(int size) :mtop(-1), msize(size)
{
mpStack = new int[msize];
}
Stack::~Stack()
{
delete[]mpStack;
mpStack = nullptr;
}
//push数据
void Stack::push(int p)
{
if (this->full())
this->resize();
mpStack[++mtop] = p;
}
//pop数据
int Stack::pop()
{
if (this->empty())
return -1;
int move = mpStack[mtop];
this->mtop--;
return move;
}
//得到最外面的数据
int Stack::top() const
{
if (empty())
throw"";
return this->mpStack[this->mtop];
}
//Mouse.cpp
#include "Mouse.h"
#include"Mouse.h"
Mouse::Mouse(int(*ms)[9]) :maze(ms) { ; }
//可以通过更改i与j开始的取值改变迷宫入口
//可以通过更改i与j最后的取值改变迷宫出口
//将走过的路线设定为3,如有需要可以单独打印走错的路线,或者其他需求
void Mouse::findMazePath()
{
int i = 0; //i为行
int j = 3; //j为列
for (; i != 7 || j != 8;) {
if (i != 8) {
if (maze.MazeSpace[i + 1][j] == 0) { //down
maze.MazeSpace[i + 1][j] = 3; //将其设定为已经走过
s.push(DOWN); //记录路线
i++;
continue;
}
}
if (j != 8) {
if (maze.MazeSpace[i][j + 1] == 0) { //right
maze.MazeSpace[i][j + 1] = 3;
s.push(RIGHT); //记录路线
j++;
continue;
}
}
if (j != 0) {
if (maze.MazeSpace[i][j - 1] == 0) { //left
maze.MazeSpace[i][j - 1] = 3;
s.push(LEFT); //记录路线
j--;
continue;
}
if (i != 0) {
if (maze.MazeSpace[i - 1][j] == 0) { //left
maze.MazeSpace[i - 1][j] = 3;
s.push(UP); //记录路线
i--;
continue;
}
}
}
switch (s.pop()) //回退
{
case 0:
j--;
break;
case 1:
i--;
break;
case 2:
j++;
break;
case 3:
i++;
break;
}
}
}
void Mouse::display() {
maze.display();
}
//依旧和之前一样如果是自定义迷宫只需将里面的数值改为变量即可
//老鼠路径
void Mouse::showPath()
{
if (s.empty())//判断路径栈是否空
{
cout << "该迷宫不存在可通行的路径" << endl;
return;
}
int i = 7;
int j = 8;
maze.MazeSpace[0][3] = 2;
for (; i != 0 || j != 3;) {
switch (s.pop())
{
case 0:
maze.MazeSpace[i][j--] = 2;
break;
case 1:
maze.MazeSpace[i--][j] = 2;
break;
case 2:
maze.MazeSpace[i][j++] = 2;
break;
case 3:
maze.MazeSpace[i--][j] = 2;
}
}
cout << "老鼠的路径为" << endl;
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (maze.MazeSpace[i][j] == 1) {
cout << "█";
}
//此处因为失败设定为3,如有需要可以单独打印走错的路线
else if (maze.MazeSpace[i][j] == 0 || maze.MazeSpace[i][j] == 3)
{
cout << " ";
}
else {
cout << " *";
}
}
cout << endl;
}
}
思考题
更新中