迷宫问题的分析与实现

【问题描述】

以一个 m*n的方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论  


其中二维矩阵中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 相关博文

c++实现源码


/*迷宫问题*/
#include<iostream>
#include<stack>
using namespace std;

char maze[10][10] =
{
	{ '0','1','1','1','1','1','1','1','1','1' },
	{ '0','1','0','1','1','1','1','1','1','1' },
	{ '0','0','0','1','1','1','1','0','0','0' },
	{ '1','0','0','0','0','1','1','0','1','0' },
	{ '1','0','1','1','0','1','1','0','1','0' },
	{ '1','0','1','1','0','1','1','0','1','0' },
	{ '1','1','0','0','0','1','1','0','1','0' },
	{ '1','1','0','1','1','1','1','0','1','0' },
	{ '1','1','0','0','0','0','0','0','1','0' },
	{ '1','1','1','1','1','1','1','1','1','0' },
};
/*打印源数据*/
void Show()
{
	for (int i = 0; i < sizeof(maze) / sizeof(maze[0]); i++)
	{
		for (int j = 0; j < sizeof(maze[0]) / sizeof(maze[0][0]); j++)
		{
			cout << maze[i][j] << " ";
		}
		cout << endl;
	}
}
/*递归查找*/
void RecFind(int i, int j)
{
	if (maze[i][j] == '1')   return;
	if (maze[i][j] == '@')   return;
	if (maze[i][j] = '@' && j == 9 && i == 9)
	{
		cout << "找到路径" << endl;
		Show();
		exit(0);
	}
	maze[i][j] = '@';
	RecFind(i, j + 1);
	RecFind(i + 1, j);
	RecFind(i, j - 1);
	RecFind(i - 1, j);
}
/*非递归实现*/
void NoRecFind()
{
	int i = 0;
	int j = 0;
	stack<char> s;
	s.push(maze[i][j]);
	maze[i][j] = '@';
	cout << "进入方法!" << endl;
	while (true)
	{
		if (maze[i][j + 1] == '0')
		{
			s.push(maze[i][++j]);
			maze[i][j] = '@';
		}
		else if (maze[i + 1][j] == '0')
		{
			s.push(maze[++i][j]);
			maze[i][j] = '@';
		}
		else if (maze[i][j - 1] == '0')
		{
			s.push(maze[i][--j]);
			maze[i][j] = '@';
		}
		else if (maze[i - 1][j] == '0')
		{
			s.push(maze[--i][j]);
			maze[i][j] = '@';
		}
		if (maze[i][j + 1] != '0' && maze[i + 1][j] != '0' &&
			maze[i][j - 1] != '0' && maze[i - 1][j] != '0')
		{
			if (i >= 9 && j >= 9)
			{
				break;
			}
			else
			{
				maze[i][j] = '*';
				s.pop();
			}
			char tmp = s.top();
			s.push(tmp);
		}
	}
	Show();
}

int main()
{
	Show();
	RecFind(0, 0);
	NoRecFind();
	return  0;
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值