首页 > 其他分享 >7.7

7.7

时间:2024-07-07 16:53:11浏览次数:10  
标签:SElement return curp int 路径 base 7.7

今天主要完成数据结构第二阶段的作业 迷宫问题 学习时间2小时 代码时间1小时

#include <stdio.h>
#include <malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

//记录通道块在迷宫矩阵当中的横、纵坐标
struct Position {
int x;
int y;
};

//放入栈当中的通道块元素
struct SElement {
int ord;//记录步数
Position p;//记录位置
int di;//记录下一次测试这一路径的临近路径的位置
};

struct MyStack {
SElement* base;
SElement* top;
int stacksize;
};

//创建一个栈如果创建成功则返回1,否则就返回0
int InitStack(MyStack* s)
{
s->base = (SElement*)malloc(STACK_INIT_SIZE * sizeof(SElement));//为栈分配初始空间
if (!s->base) return 0;
s->top = s->base;//设定为空栈
s->stacksize = STACK_INIT_SIZE;
return 1;
}

//判断栈是否为空,如果是空的就返回0,否则就返回1
int IsStackEmpty(MyStack* s)
{
if (s->top == s->base) return true;
return false;
}

//获取栈顶元素,如果栈为空就返回0 否则就返回1
int GetTop(MyStack* s, SElement* e)
{
if (IsStackEmpty(s)) return 0;
e = s->top - 1;
return 1;
}

//获取栈的长度,并且通过程序返回
int StackLength(MyStack* s)
{
return s->top - s->base;
}

//插入元素e为新的栈顶元素,插入成功则返回1,否则返回0
int Push(MyStack* s, SElement e)
{
if (s->top - s->base >= STACK_INIT_SIZE)
{
s->base = (SElement*)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(SElement));
if (!s->base) return 0;
s->top = s->base + s->stacksize;
s->stacksize += STACKINCREMENT;
}
*(s->top) = e;
s->top++;
return 1;
}

//弹出栈顶元素赋值给e弹出成功返回1,弹出失败返回0
int Pop(MyStack* s, SElement* e)
{
if (IsStackEmpty(s)) return 0;
*e = *(s->top - 1);
s->top--;
return 1;
}

//定义墙元素为1 可走路径为0 已知路径为curStep 不能够通过的路径为-2
#define m 15
#define n 18
int Maze[m][n] = { { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,1,1,1,0,1,0,0,1,0,1,1,1,1,1,0,1 },
{ 1,0,1,1,1,0,1,0,1,1,0,1,0,1,1,0,0,1 },
{ 1,0,0,0,0,0,1,0,1,1,0,1,0,0,0,0,1,1 },
{ 1,1,1,1,0,0,1,0,1,1,0,1,1,1,1,0,1,1 },
{ 1,1,1,0,0,1,1,0,1,1,0,0,0,1,1,1,1,1 },
{ 1,1,1,0,1,1,1,0,1,1,1,1,0,1,1,0,0,1 },
{ 1,1,1,0,0,0,0,0,0,0,1,1,0,1,1,0,1,1 },
{ 1,0,0,1,1,1,1,1,1,0,1,1,0,1,0,0,1,1 },
{ 1,1,0,0,0,0,0,0,0,0,1,0,0,1,0,1,1,1 },
{ 1,0,0,1,0,1,0,1,0,0,1,1,0,0,0,1,1,1 },
{ 1,1,0,1,0,1,0,1,1,1,0,0,0,1,1,1,1,1 },
{ 1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 } };

//辅助函数考察当前路径能否通过
bool Pass(Position posi)
{
//只有路径所在位置的数字为0的是可以走的
if (Maze[posi.x][posi.y] == 0)
{
return true;
}
return false;
}

//按顺时针方向从右开始寻找矩阵当中某一个位置的临近位置
Position NextPosition(Position now, int direction)
{
Position next;
int x = now.x;
int y = now.y;
switch (direction)
{
//右
case 1: {
next.x = x;
next.y = y + 1;
break;
}
//下
case 2: {
next.x = x + 1;
next.y = y;
break;
}
//左
case 3: {
next.x = x;
next.y = y - 1;
break;
}
//上
case 4:
{
next.x = x - 1;
next.y = y;
break;
}
default:break;
}
return next;
}

//改变改点为步骤数
void FootPrint(Position p, int step)
{
Maze[p.x][p.y] = step;
}

//路径不可走的话就留下-2的标记
void MarkPrint(Position p)
{
Maze[p.x][p.y] = -2;
}

//打印出迷宫矩阵
void Display_migong()
{
for (int i = 0; i<m; i++)
{
for (int j = 0; j<n; j++)
{
if (Maze[i][j]<0)
printf("%d ", Maze[i][j]);
else if (Maze[i][j]<10)
printf("%d ", Maze[i][j]);
else
printf("%d ", Maze[i][j]);
}
printf("\n");
}
}

int main()
{
struct Position path1[m * n]; // 最多能存储m*n个坐标
int pathCount = 0; // 当前已存储的坐标数量
//迷宫程序主体
MyStack path;//记录路径的栈
InitStack(&path);//初始化路径数组
Position curp;//当前被试位置
Display_migong();
//初始化当前位置为矩阵入口
curp.x = 1;
curp.y = 1;
int curStep = 1;//被探索的步数
do
{
if (Pass(curp))
{
FootPrint(curp, curStep);//可走就在迷宫里面留下足迹
//创建一个栈元素,存储可行路径的相关值,将这个元素存储到栈当中
SElement e;
e.di = 1;//下一个路块为这一个路块的右边的路块
e.ord = curStep;
e.p.x = curp.x;
e.p.y = curp.y;
Push(&path, e);//将路径块入栈
path1[pathCount++] = curp;
if (curp.x == m - 2 && curp.y == n - 2) break; //如果被压入的路径块到了迷宫的终点就退出循环
curp = NextPosition(curp, 1);//找到前一个被试块东面的路径块作为被试块
curStep++;//被探索的步数加一
}
else//如果当前被试路径不能够通过的话
{
if (!IsStackEmpty(&path))
{
SElement e;
Pop(&path, &e);
curStep--;
//将所有的周围路径都已经被测试过的路径从栈中清除
while (e.di == 4 && !IsStackEmpty(&path)) {
MarkPrint(e.p);
Pop(&path, &e);
curStep--;
}
//如果当前栈顶还有未被测试的路径就测试剩余的周围路径
if (e.di<4)
{
curp = NextPosition(e.p, e.di + 1);
e.di++;
curStep++;
Push(&path, e);
}
}
}
} while (!IsStackEmpty(&path));
printf("\n");
//打印出结果迷宫矩阵
Display_migong();
for (int i = 0; i < pathCount; i++) {
printf("(%d, %d)->", path1[i].x, path1[i].y);
}

return 0;
}

标签:SElement,return,curp,int,路径,base,7.7
From: https://www.cnblogs.com/galileo9527/p/18288675

相关文章

  • 暑假第一周总结(6.29-7.7)
    时间是残酷的,从来不愿停下脚步等一等谁在石铁大的第一年结束了,成功分流到软工系的我迎来了第一次大学暑假(可能也是最后一次暑假)。回首这一年,自己没走上自己预期的道路,尽管经历师长前辈名言警句的洗礼,仍旧困顿于过往,既然意识到这一切的不正确,那么就痛定思痛,让一切回到正轨!///......
  • IDA7.7 使用IDAPython搜索指定模式的二进制数据方法
    新版的ida弃用了idc.find_binary推荐使用ida_bytes.bin_search方法。ida_bytes.bin_search需要和ida_bytes.parse_binpat_str配合使用。ida_bytes.parse_binpat_str的功能类似于对正则表达式进行编译。ida_bytes.parse_binpat_str官方文档importida_bytesimportidaapiimpo......
  • 7.1 ~ 7.7
    7.1搬了校区。发现我们虽然是在西扩上课,但宿舍还是老校区的\(12\)人宿舍,输。不过教学楼好玩的东西还是挺多的。本来我们是和化奥组一个班,但因为物奥集训&&我们班人数过多(\(69\))把我们和生奥放在了一起;然后我们名义上的班主任还是张华,各种老师...很乱。无所谓,既来之......
  • 区块链会议投稿资讯CCF C--ICPADS 2024 截止7.7 附录用率(高录用率)
    Conference:30thInternationalConferenceonParallelandDistributedSystems(ICPADS2024)CCFlevel:CCFCCategories:ComputerArchitecture/ParallelandDistributedComputing/StorageSystemsYear:2024Conferencetime: October10–14th2024录用率: ICPADS ......
  • 谢启鸿高等代数第四版习题7.7部分习题解析part2.以及部分第7章复习题
    7.7部分定理:以为特征值的K阶若当块个数为11.设n阶矩阵A的特征值全为1,求证:对任意的正整数K,与A相似。证明:=(易证故此处不再证明)而且的特征值全为1。的特征值为1的k阶若当块的个数为接下来只需证明相似于即可;即证明两者有相同的约当标准型.由书上7.8节的数学归纳可以知道......
  • centos 7.9 二进制部署 kubernetes v1.27.7
    文章目录1.预备条件2.基础配置2.1配置root远程登录2.2配置主机名2.3安装ansible2.4配置互信2.5配置hosts文件2.6关闭防firewalld火墙2.7关闭selinux2.8关闭交换分区swap2.9修改内核参数2.10安装iptables2.11开启ipvs2.12配置limits参数2.13配置yum2.14配置时钟......
  • 将Centos系统从7.0~7.7升级到7.8版本
     1.检查内核版本yuminfokernel-q 已安装的软件包名称   :kernel架构   :x86_64版本   :3.10.0发布   :862.el7大小   :62M源   :installed来自源:anaconda简介   :TheLinuxkernel网址   :http://www.kernel.org/协议   :GPLv2描述   :The......
  • Elasticsearch 7.17.7开启x-pack
    1、ES配置文件  elasticsearch.ymlcluster.name:elasticsearchnode.name:node-1network.host:0.0.0.0discovery.type:single-nodexpack.security.enabled:truexpack.security.authc.api_key.enabled:true设置密码/usr/share/elasticsearch/bin/elasticsearch-s......
  • 7.7 实现进程内存读写
    内存进程读写可以让我们访问其他进程的内存空间并读取或修改其中的数据。这种技术通常用于各种调试工具、进程监控工具和反作弊系统等场景。在Windows系统中,内存进程读写可以通过一些API函数来实现,如OpenProcess、ReadProcessMemory和WriteProcessMemory等。这些函数提供了一种通......
  • 《动手学深度学习 Pytorch版》 7.7 稠密连接网络
    7.7.1从ResNet到DenseNetDenseNet可以视为ResNet的逻辑扩展。ResNet将函数展开为\(f(\boldsymbol{x})=x+g(\boldsymbol{x})\),即一个简单的线性项和一个复杂的非线性项。若将\(f\)拓展成超过两部分,则DenseNet便是其中一种方案。这即是DenseNet和ResNet的主要区......