迷宫问题的递归与非递归写法

#include <iostream>
using namespace std;
#include <stack>

struct Pos//定义坐标点
{
	size_t _row;
	size_t _col;
};

template<size_t M, size_t N>
class Maze
{
protected:
	int _maze[M][N];
	stack<Pos> shortPath;
public:
	Maze(int maze[][N])//构造函数,初始化对象
	{
		for (size_t i = 0; i < M; i++)
		{
			for (size_t j = 0; j < N; j++)
			{
				_maze[i][j] = maze[i][j];
			}
		}
	}

	void print()//打印二维矩阵函数
	{
		for (size_t i = 0; i < M; i++)
		{
			for (size_t j = 0; j < N; j++)
			{
				cout << _maze[i][j] << " ";
			}
			cout << endl;//每行完了换行
		}
		cout << endl;//最后换行
	}

	bool CheckAccess(Pos next,Pos entry)//探测next位置是否可通
	{
		if (next._row < M && next._col < N &&
			((_maze[next._row][next._col] == 0)
				||(_maze[next._row][next._col]>_maze[entry._row][entry._col])))//坐标点合法且这点值为0
		{
			return true;
		}
		return false;
	}

	bool GetPath(Pos entry)//找通路
	{
		//上下左右四个方向探测
		Pos cur, next;//定义当前点、下一个点的坐标
		cur = entry;//让cur来到入口
		stack<Pos> path;
		path.push(entry);


		while (!path.empty())
		{
			cur = path.top();  //
			_maze[cur._row][cur._col] = 2;// 将走过的路设置为2,如果 程序每个来到这,说明是continue上来的,next

										  ////出口只针对这道题?
			if (cur._row == M - 1)//出口
			{
				return true;
			}

			//上
			next = cur;//让next也先指向入口
			next._row -= 1;
			if (CheckAccess(next))//上可通
			{
				//cur = next;//再以可通的点作为入口
				path.push(next);  //
				continue;//只要一个方向可通,则不需要判断下一个,即后面的语句不再被执行
			}
			//右
			next = cur;//让next恢复到入口
			next._col += 1;
			if (CheckAccess(next))//上可通
			{
				//cur = next;//再以可通的点作为入口
				path.push(next);
				continue;//只要一个方向可通,则不需要判断下一个,即后面的语句不再被执行
			}

			//下
			next = cur;//让next恢复到入口
			next._row += 1;
			if (CheckAccess(next))//上可通
			{
				//cur = next;//再以可通的点作为入口
				path.push(next);
				continue;//只要一个方向可通,则不需要判断下一个,即后面的语句不再被执行
			}

			//左
			next = cur;//让next恢复到入口
			next._col -= 1;
			if (CheckAccess(next))//上可通
			{
				//cur = next;//再以可通的点作为入口
				path.push(next);
				continue;//只要一个方向可通,则不需要判断下一个,即后面的语句不再被执行
			}

			//回溯
			path.pop();
		}
		return false;
	}











	void GetShortPath(Pos entry, stack<Pos>& path)//递归找通路坐标点
	{
		path.push(entry);

		if (entry._row == M - 1)
		{
			if (shortPath.empty() || path.size() < shortPath.size())
			{
				shortPath = path; // ortPath最短路径
			}
			cout << "找到一个出口" << "[" << entry._row << "," << entry._col << "]" << endl;
			if (!shortPath.empty())
			{
				cout << "最短路径:出口";
				stack<Pos> tmp = shortPath;
				while (!tmp.empty())
				{
					Pos& top = tmp.top();
					printf("[%d,%d]<-", top._row, top._col);
					tmp.pop();
				}
				cout << endl;
			}

			cout << endl;
			return;
		}


		Pos next;
		//上
		next = entry;
		next._row -= 1;
		if (CheckAccess(next,entry))
		{
			_maze[next._row][next._col] = _maze[entry._row][entry._col]+1;
			GetShortPath(next, path);
		}

		//右
		next = entry;
		next._col += 1;
		if (CheckAccess(next, entry))
		{
			_maze[next._row][next._col] = _maze[entry._row][entry._col] + 1;
			GetShortPath(next, path);
		}

		//下
		next = entry;
		next._row += 1;
		if (CheckAccess(next, entry))
		{
			_maze[next._row][next._col] = _maze[entry._row][entry._col] + 1;
			GetShortPath(next, path);
		}


		//左
		next = entry;
		next._col -= 1;
		if (CheckAccess(next, entry))
		{
			_maze[next._row][next._col] = _maze[entry._row][entry._col] + 1;
			GetShortPath(next, path);
		}

		path.pop();
	}











	void GetPathR(Pos entry)//递归找通路
	{

		_maze[entry._row][entry._col] = 2;
		if (entry._row == M - 1)
		{
			cout << "找到一个出口" << "[" << entry._row << "," << entry._col << "]" << endl;
			return;
		}

		Pos next;
		//上
		next = entry;
		next._row -= 1;
		if (CheckAccess(next))
		{
			GetPathR(next);
		}

		//右
		next = entry;
		next._col += 1;
		if (CheckAccess(next))
		{
			GetPathR(next);
		}

		//下
		next = entry;
		next._row += 1;
		if (CheckAccess(next))
		{
			GetPathR(next);
		}


		//左
		next = entry;
		next._col -= 1;
		if (CheckAccess(next))
		{
			GetPathR(next);
		}


	}

};




void TestMaze()
{
	int mazeArray[10][10] = { { 1,1,1,1,1,1,1,1,1,1 },
	{ 1,1,1,1,1,1,1,1,1,1 },
	{ 0,0,0,1,1,1,1,1,1,1 },
	{ 1,1,0,1,1,1,1,1,1,1 },
	{ 1,1,0,0,0,0,1,1,1,1 },
	{ 1,1,0,1,1,0,1,1,1,1 },
	{ 1,1,0,1,1,0,1,1,1,1 },
	{ 1,1,0,1,1,0,1,1,1,1 },
	{ 1,1,0,1,1,0,1,1,1,1 },
	{ 1,1,0,1,1,0,1,1,1,1 }
	};
	Maze<10, 10> maze(mazeArray);//用已知数组mazeArray初始化对象maze
	maze.print();
	Pos entry = { 2,0 };
	//if (maze.GetPath(entry))
	//{
	//	cout << "找到通路" << endl;
	//}
	//else
	//{
	//	cout << "找不到通路" << endl;
	//}
	//maze.GetPath(entry);//从入口进去找通路
	//maze.GetPathR(entry);
	stack<Pos> path;
	maze.GetShortPath(entry, path);
	maze.print();
}

int main()
{
	TestMaze();
	return 0;
}

全部评论

相关推荐

工作基本定了,比较满意。这深度学习真是难搞啊,论文看不懂,代码看不懂,不会改,创新点???&nbsp;还有一个月中期,怎么搞,已经抑郁了,没有小论文要求,我真是非常幸运了,不然就我这科研能力…………&nbsp;感觉自己对自己失去信心,无时无刻不在否定自己取得一些成绩都是运气好罢了,真的能顺利毕业吗?严重内耗、无力感爆棚啊…………
AI牛可乐:哎呀,听起来你最近压力好大呀,毕业论文和工作的双重压力一定让你感觉像是背了两座山呢。深度学习确实挺复杂的,就像是要在一片迷雾中找到出路一样。但是,你已经很棒了,工作都定好了,这是很大的成就呢! 论文的事情,别太担心。每个人都有看不懂代码和论文的时候,这是正常的。至于创新点嘛,有时候灵感就像小猫一样,需要一点一点地哄出来的。你可以先试试把你看过的资料整理一下,说不定就能找到新的思路呢。 中期答辩前,你可以列个计划,一步一步来,把大问题分解成小问题,一点一点克服。记得,你不是一个人在战斗,你的导师、同学都是你的战友哦。 至于信心嘛,别否定自己,每个人都会有低谷的时候。你已经取得的成绩,都是你实力的体现。毕业不是问题,只要你不放弃,就一定能顺利走过去的。加油哦,我相信你可以的! 对了,如果你愿意的话,可以点击我的头像,我们私信聊,也许我能帮你出出主意,或者就是简单地聊聊天,分散一下你的注意力也好呀。🐮💪🌟
点赞 评论 收藏
分享
我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
09-29 17:44
已编辑
蔚来_测(准入职员工)
//鲨鱼辣椒:见不了了我实习了四个月上周再投筛选了一天就给我挂了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务