用栈寻找迷宫的最短路径



#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <assert.h>
#include <stack>

struct Pos
{
	size_t x;
	size_t y;
};

stack<Pos> MinPath;

void InitMaze(int *maze, size_t size)
{
	assert(maze);
	FILE* fout = fopen("E:\\数据结构\\5_17_2016\\Maze.txt", "r");//在Maze.txt中写了一个迷宫的布局
	assert(fout);  //断言fout,若读取Maze.txt失败,fout为NULL

	for (size_t i = 0; i < size; i++)
	{
		for (size_t j = 0; j < size;)
		{
			char ch = getc(fout);      //一个字符一个字符的获取fout读取的内容

			if (ch == '0' || ch == '1') //是‘0’或 ‘1’时读入maze[]数组中
			{
				maze[i*size+j] = ch - '0';//将ch从字符转为数字
				j++;
			}
		}
	}
}

void PrintMaze(int* maze, size_t size)//打印
{
	for (size_t i = 0; i < size; i++)
	{
		for (size_t j = 0; j < size; j++)
		{
			cout << maze[i*size + j] << " ";
		}
		cout << endl;
	}
}

stack<Pos> GetMorePath(int* maze, size_t size, Pos entry, stack<Pos> path)//获取该迷宫的最优路径,maze是迷宫,size是迷宫的长宽(正方形),entry 迷宫的入口点, path 一个栈用来存放路径
{                                                                          //此处应注意二维数组的传参和使用
	assert(maze); //断言
	path.push(entry); //将迷宫入口入栈
	maze[entry.x *size + entry.y] = 2; //此处将二维数组当一维数组来访问 maze[i][j]  =>  maze[i*size+j]
	Pos cur = {};                      //保存栈顶元素
	while (path.top().x != size - 1 && path.top().y != size - 1 && path.top().x != 0)
	{
		cur = path.top();
		if (maze[(cur.x - 1)*size + cur.y] == 0 && (cur.x - 1) >= 0)//上;该位置为0,且该位置存在
		{
			cur.x = cur.x - 1;
			cur.y = cur.y;
			maze[cur.x *size + cur.y] = 2;  //若可以走,将该位置置为2
			path.push(cur);
			continue;
		}
		else if (maze[(cur.x + 1)*size + cur.y] == 0 && (cur.x + 1) < size)//下;该位置为0,且该位置存在
		{
			cur.x = cur.x + 1;
			cur.y = cur.y;

			maze[cur.x *size + cur.y] = 2;
			path.push(cur);
			continue;
		}
		else if (maze[cur.x*size + cur.y - 1] == 0 && (cur.y - 1) >= 0)//左;该位置为0,且该位置存在
		{
			cur.x = cur.x;
			cur.y = cur.y - 1;
			maze[cur.x*size + cur.y] = 2;
			path.push(cur);
			continue;

		}
		else if (maze[cur.x*size + (cur.y) + 1] == 0 && (cur.y + 1) < size)//右;该位置为0,且该位置存在
		{
			cur.x = cur.x;
			cur.y = cur.y + 1;

			maze[cur.x*size + cur.y] = 2;
			path.push(cur);
			continue;
		}
		else                                                            
		{
			if (path.top().x == entry.x && path.top().y == entry.y)  //路径栈path中只有一个元素entry,则entry出栈;且跳出
			{
				path.pop();
				break;
			}
			else
			{
				path.pop(); //已经找到出口
			}
		}
	}
	/*cout << endl;
	PrintMaze(maze, 10);*/
	while (!path.empty() && (MinPath.size() > path.size() || MinPath.empty()))  //当栈path 不为空;且(最短路径MinPath 的size 大于path 的size )
    {
		while (!path.empty())
		{
			MinPath.push(path.top());//交换MinPath和path的内容
			path.pop();
		}
		/*MinPath = path;*///不可以直接赋值,path不会清空
		InitMaze(maze, 10);
		maze[cur.x*size + cur.y] = 6;//将已经走过的可以走通的路的终点置为6;保证下次不会再走这条路

		GetMorePath(maze, size, entry, path);//递归,再寻找其他的路
	}
	return MinPath;
}

void TestMzae()
{
	int maze[10][10];//定义一个10 X 10的数组
	InitMaze((int*)maze, 10);//初始化数组
	PrintMaze((int*)maze, 10);
	Pos entry = { 2, 0 };
	stack<Pos> path;
	path = GetMorePath((int*)maze, 10, entry, path);
	cout << endl;
	PrintMaze((int*)maze, 10);
}

int main()
{
	
	TestMzae();
	system("pause");
	return 0;
}

前一段时间实现的一个寻找一个迷宫中最短路径的代码,主要是使用栈来记录路径;

这次写代码的最大感触:虽然自己平时也做一些写代码的练习,但并没有很好养成写注释的这个习惯,这几天在CSDN上浏览博客,觉得其他的博主的代码注释写的都很好,使代码有很强的可读性,今天写这篇博客翻出之前写的代码,这个迷宫代码行数也比较少,逻辑也不是很难,看起来不是很难,但是以后要是真的要有很难的很长的代码,不注释的话,自己都很难看懂,更别说给小伙伴们看了。写注释很重要,写注释很重要,写注释很重要!!!重要的话说三遍

欢迎大家来提出意见,共同进步!



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值