使用递归找所有迷宫路径,求二维数组的存储量与地址(数据结构作业06)

目录

使用递归找所有迷宫路径 

代码:

运行结果:

 求二维数组的存储量与地址


使用递归找所有迷宫路径 

有一个迷宫如下图所示:

,使用递归思想,找出所有从入口(1,1)到出口(4,2)的路径。

代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
	int i,j;
	//i为行,j为列号
} box;//表示这是一个方块类型

typedef struct {
	box data[50];
	int length = 0;
} pathtype; //迷宫路径类型

const int m = 4,n = 4;
//这表示这是一个4乘4大小的迷宫。
int maze[m + 2][n + 2] = {
	//要给迷宫加上一道围墙,所以行和列都要加2
	//墙初始化为1,没墙初始化为0
	{1, 1, 1, 1, 1, 1},
	{1, 0, 0, 0, 1, 1},
	{1, 0, 1, 0, 0, 1},
	{1, 0, 0, 0, 1, 1},
	{1, 1, 0, 0, 0, 1},
	{1, 1, 1, 1, 1, 1}
};

void mgpath(int xi,int yi,int xe,int ye,pathtype path) {
	//xiyi为当前位置,xeye为迷宫终点
	//起点为1,1终点为4,2
	int i,j;
	if(xi == xe && yi == ye) {
		path.data[path.length].i = xi;
		path.data[path.length].j = yi;
		path.length++;
		//将出口的方块添加到path中
		printf("迷宫路径如下:\n");
		for(int k = 0; k < path.length; k++) {
			printf("\t(%d,%d)",path.data[k].i,path.data[k].j);
		}
		//输出迷宫路径
		printf("\n");
		//这里输出路径后函数不返回,由于递归会输出所有路径
	}
	else {
		if(maze[xi][yi] == 0) {
			//当当前方块可走时
			int di;
			di = 0;
			//使用di表示方位0表示上,1表示向右,2表示向下,3表示向左
			while(di < 4) {
				path.data[path.length].i = xi;
				path.data[path.length].j = yi;
				path.length++;
				//将当前方块放入path中
				switch(di) {
				case 0:i = xi - 1; j = yi; break;
				case 1:i = xi; j = yi + 1; break;
				case 2:i = xi + 1; j = yi; break;
				case 3:i = xi; j = yi - 1; break;
				}
				//遍历4个方位
				maze[xi][yi] = -1;
				//将当前方块置为-1表示走过
				mgpath(i,j,xe,ye,path);
				//递归,如果遍历的方块可走,就继续递归
				//否则返回,将当前方块重新变为0,让path长度减一,让di加一来遍历另一个方位
				maze[xi][yi] = 0;
				path.length--;
				di++;
			}
		}
	}
	
}

int main() {
	pathtype path;
	mgpath(1,1,4,2,path);
	//传入出口位置和出口位置
	return 0;
}

运行结果:

 求二维数组的存储量与地址

设有二维数组A[6*8],每个元素占用6个字节存储,实现存放,A[0,0]的起始地址为1000,请计算(要求每一问写出计算过程):

  1. 数组A的存储量;
  2. 数组A的最后一个元素A[5,7]的起始地址;
  3. 按行优先存放时,元素A[1,4]的起始地址;
  4. 按列优先存放时,元素A[4,7]的起始地址;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

柏箱

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

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

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

打赏作者

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

抵扣说明:

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

余额充值