数据结构——非递归动态迷宫问题

本文介绍了《数据结构》书中的一种非递归动态迷宫问题的简洁版代码实现,包括随机生成迷宫和寻路算法。生成迷宫时通过随机数设定墙壁与道路,调整难度系数N。寻路算法使用方向数组,遇到死路则回溯。提供了代码运行的部分展示,并给出了完整代码的获取方式。
摘要由CSDN通过智能技术生成


# 迷宫问题 数据结构(清华大学出版社)一书中的迷宫问题一直是不可避免的练习题,本文章带来的是非递归的动态迷宫问题的代码(简洁版),该代码简单易懂,适合初学者使用学习。

如需要升级版非递归迷宫,请点击此文章阅读:数据结构——升级版迷宫非递归求解问题

迷宫生成

该算法迷宫生成部分使用随机生成随机数来随机生成,首先随机生成0-10的随机数,设置数N=3,如果生成的随机数大于等于3,那么返回0(即为路),否则返回1(即为墙),然后四周全部设为1。

并且可以通过改变N 的大小来设置迷宫难度。

迷宫寻路

该迷宫寻路部分,首先设置方向数组,让小人随机向四个方向走,如果可以走,那么继续进行,如果前路不能走(墙或走过的路),那么退栈,并将此处标记为死路。

代码运行结果

在这里插入图片描述

部分代码展示

int main() {
	int i, j;
	int move[4][2] = { {0,1},{1,0},{0, -1},{-1,0} };  //定义移动数组
	int o; cout << "是否随机生成迷宫(1为是,0为否):";
	cin >> o;
	do
	{
	if (o == 1) RMaze();
	else if (o == 0)
	{
		cout<<"请自行输入迷宫:"<<endl;
		for(int i=0;i<m+2;i++)
		{
			for(int j=0;j<p+2;j++)
				cin>>Maze[i][j];
		}
	}
	else cout << "输入错误,请重新输入!" << endl;
	} while (o != 1 && o != 0);
	for (int i = 0; i < m + 2; i++)
	{
		for (int j = 0; j < p + 2; j++)
		{
			Transformation(Maze[i][j]);
		}
		cout << endl;
	}
	for (i = 0; i < m + 2; i++)
		for (j = 0; j < p + 2; j++) mark[i][j] = 0;    //标记数组赋值:都赋值0,表示未走
	TIMEDELAY();
	system("cls");
	mark[1][1] = 1; //把mark[1][1]赋值1,表示从[1][1]点出发
	Path(m, p, move, Maze, mark);//调用SeekPath函数,寻找能走出迷宫的路径
	system("pause");
	return 0;
}

代码获取途径

如需完整代码请添加点击以下链接进行购买:https://download.csdn.net/download/m0_54688810/20224758

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,这是一个比较经典的算法题目,我来为您讲解一下思路。 首先,我们需要用一个二维数组来表示迷宫,1代表墙,0代表道路。假设起点为(0,0),终点为(m-1,n-1),其中m和n表示迷宫的行数和列数。 接下来,我们可以使用来实现非递归的深度优先搜索算法。具体步骤如下: 1. 将起点入,并将其标记为已经访问过。 2. 当不为空时,取出顶元素,判断其是否为终点。如果是,则说明已经找到了一条路径,输出路径并结束程序。如果不是,则继续执行下一步。 3. 遍历当前节点的邻居节点(上下左右四个方向),如果邻居节点未被访问过且为0,则将其入,并将其标记为已经访问过。 4. 重复步骤2和3,直到找到一条路径或者为空。 下面是用C语言实现的代码: ```c #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef struct { int x, y; } Position; typedef struct { Position data[MAXSIZE]; int top; } Stack; void InitStack(Stack *S) { S->top = -1; } void Push(Stack *S, Position p) { S->data[++S->top] = p; } void Pop(Stack *S) { S->top--; } Position Top(Stack S) { return S.data[S.top]; } int IsEmpty(Stack S) { return S.top == -1; } int Maze[MAXSIZE][MAXSIZE]; int Visited[MAXSIZE][MAXSIZE]; int m, n; void PrintPath(Stack S) { while (!IsEmpty(S)) { Position p = Top(S); printf("(%d,%d)\n", p.x, p.y); Pop(&S); } } int main() { scanf("%d%d", &m, &n); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { scanf("%d", &Maze[i][j]); Visited[i][j] = 0; } } Stack S; InitStack(&S); Position start = {0, 0}; Push(&S, start); Visited[start.x][start.y] = 1; while (!IsEmpty(S)) { Position cur = Top(S); if (cur.x == m-1 && cur.y == n-1) { PrintPath(S); return 0; } // 上 if (cur.x > 0 && Maze[cur.x-1][cur.y] == 0 && !Visited[cur.x-1][cur.y]) { Position next = {cur.x-1, cur.y}; Push(&S, next); Visited[next.x][next.y] = 1; continue; } // 下 if (cur.x < m-1 && Maze[cur.x+1][cur.y] == 0 && !Visited[cur.x+1][cur.y]) { Position next = {cur.x+1, cur.y}; Push(&S, next); Visited[next.x][next.y] = 1; continue; } // 左 if (cur.y > 0 && Maze[cur.x][cur.y-1] == 0 && !Visited[cur.x][cur.y-1]) { Position next = {cur.x, cur.y-1}; Push(&S, next); Visited[next.x][next.y] = 1; continue; } // 右 if (cur.y < n-1 && Maze[cur.x][cur.y+1] == 0 && !Visited[cur.x][cur.y+1]) { Position next = {cur.x, cur.y+1}; Push(&S, next); Visited[next.x][next.y] = 1; continue; } // 所有邻居节点都已经访问过,出 Pop(&S); } printf("No path found\n"); return 0; } ``` 注意,这里用到了一个结构体Stack,实现了的基本操作。另外,为了方便起见,我们将起点和终点的坐标分别定义为{0,0}和{m-1,n-1},并且将Visited数组用来记录每个节点是否已经被访问过。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数学小白不秃头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值