最新要闻
- 全球今日讯!祥鑫科技:5月8日接受机构调研,信达证券、华安基金等多家机构参与
- 天天日报丨谷爱凌:90%网络传言都是假的 不会为负面评价难过
- 午睡过久会长胖吗?研究发现:午睡时长影响健康 30分钟是关键点-全球最新
- 曾被称为格力接班人!格力直播间孟羽童视频被删除 天天动态
- 淄博90后女店主2个月瘦了10斤:1天烤鸡腿上千个 世界快讯
- 天天热点评!苹果在iPhone 14上挤牙膏!果粉立马用脚投票:好评率跌了
- 前法鹰主管:当年签镰田大地时他还很年轻,但能力让我想到齐达内
- 赛轮轮胎:公司开具的电子商业承兑汇票均已结清|世界速看料
- 00后男生取名江胡传奇:妈妈姓胡 爸爸喜欢玩《传奇》 每日速读
- 取代安卓14!OpenHarmony 4.0即将公测:华为鸿蒙4.0“母系统”
- 世界看点:任天堂开始乱杀!看《塞尔达传说:王国之泪》合法游戏画面也被封
- 京东APP大升级!12.0上线:应简尽简 营销和弹窗少了_最资讯
- 1799元 九号平衡车L8奥特曼定制版明日首销:隔壁小孩羡慕哭了
- 当前速看:金华市东苑小学新生入学网上模拟报名详情2023
- 加要求中方一领事官员离境_中方反制|今日讯
- 世界视讯!今日欧元/美元汇率行情预测(2023年5月9日)
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
世界快看:数据结构与算法大作业:走迷宫程序(C语言,DFS)(代码以及思路)
好家伙,写大作业,本篇为代码的思路讲解
(资料图)
1.大作业要求
走迷宫程序
问题描述:
以一个 m * n 的长方阵表示迷宫, 0和1分别表示迷宫的通路和障碍。 设计一个程序, 对任意设定的迷宫, 求出一条从入口到出口的通路, 或得出没有通路的结论。
基本要求:
(1) 实现一个以链表做存储的栈类型, 然后编写一个求解迷宫的非递归程序。 求的通路以三元组(i, j, d) 的形式输出, 其中:(i, j) 指示迷宫中的一个坐标, d 表示走到下一坐标的方向。 如: 对于下列数据的迷宫, 输出一条通路:
(1, 1, 1),(1, 2, 2),(2, 2, 2),(3, 2, 3),(3, 1, 2) ……。
(2) 编写递归形式的算法, 求得迷宫中所有可能的道路;
扩展功能要求:
以方阵形式输出迷宫及其到道路
测试数据: 迷宫的测试数据如下: 左上角(1, 1) 为入口, 右下角(8, 9) 为出口。
作业要求
1、 选题:从4个题目中任选其一,独立完成。程序至少采用所学过的一种数据结构(链表、栈、队列、树等)实现。学生可以根据自己的需求分析适当地调整程序的合理性,使得程序能够更加贴近实际。每个题目选题人员不得超过15人,向学委报名选题情况,先报先得,每个题目满15人后必须另选其他题目。
2、 程序代码要求:程序要求能够正常运行,基本功能必须全部实现。完成可选做的扩展功能将得到较高的分数。容错性强和功能细节考虑更完全也将得到较高的分数。
3、 开发语言:软件工程和数据科学与大数据技术专业用Java语言,计算机科学与技术专业用C或C++语言。
2.分析
来概括一下
这是个迷宫程序,手动输入迷宫,找出所有解,输出所有解
数据结构要用栈
解法:
我们用一个二维度数组保存这个"迷宫"
1.随后,我们确定起点和终点,
2.先站在起点上,将起点入栈
3.我们开始寻路,按照东南西北(即右下左上)的方向顺序寻找下一坐标
3.1.如果该方向上有路,将下一坐标入栈,"走到"这个坐标上
3.2.如果下一坐标上是墙,则返回
3.3.如果下一个点是出口,则打印线路
3.单路径版本
大概是这样了
代码如下:
单路径版本
#include#include #include #define MAXN 20struct mark // 定义迷宫内点的坐标类型{ int x; int y;};struct Element // 链栈元素结点{ int x, y; // x行,y列 int d; // d下一步的方向};typedef struct LStack // 链栈{ Element elem; struct LStack *next; // 指针变量};typedef LStack *PLStack;/*……………………………栈函数……………………………*/int InitStack(PLStack &S) // 构造空栈{ S = NULL; return 1;}int StackEmpty(PLStack S) // 判断栈是否为空{ if (S == NULL) return 1; else return 0;}int Push(PLStack &S, Element e) // 压入新数据元素{ PLStack p; p = (PLStack)malloc(sizeof(LStack)); p->elem = e; p->next = S; S = p; return 1;}int Pop(PLStack &S, Element &e) // 栈顶元素出栈{ PLStack p; if (!StackEmpty(S)) { e = S->elem; p = S; S = S->next; free(p); return 1; } else return 0;}/*……………………求迷宫路径函数……………………………*/void MazePath(struct mark start, struct mark end, int maze[MAXN][MAXN], int diradd[4][2]){ int i, j, d; int a, b; Element elem, e; PLStack S1, S2; InitStack(S1); InitStack(S2); maze[start.x][start.y] = 2; // 入口点作上标记 elem.x = start.x; elem.y = start.y; elem.d = -1; // 开始为-1 Push(S1, elem); while (!StackEmpty(S1)) // 栈不为空 有路径可走 { Pop(S1, elem); i = elem.x; j = elem.y; d = elem.d + 1; // 下一个方向 while (d < 4) // 试探东南西北各个方向 { a = i + diradd[d][0]; b = j + diradd[d][1]; if (a == end.x && b == end.y && maze[a][b] == 0) // 如果到了出口 { elem.x = a; elem.y = b; elem.d = 886; // 方向输出为-1 判断是否到了出口 Push(S1, elem); printf("\n0=东 1=南 2=西 3=北 886为则走出迷宫\n\n通路为:(行坐标,列坐标,方向)\n"); while (S1) // 逆置序列 并输出迷宫路径序列 { Pop(S1, e); Push(S2, e); } while (S2) { Pop(S2, e); printf("-->(%d,%d,%d)", e.x, e.y, e.d); } return; // 跳出两层循环,本来用break,但发现出错,exit又会结束程序,选用return } if (maze[a][b] == 0) // 找到可以前进的非出口的点 { maze[a][b] = 2; // 标记走过此点 elem.x = i; elem.y = j; elem.d = d; Push(S1, elem); // 当前位置入栈 i = a; // 下一点转化为当前点 j = b; d = -1; } d++; } } printf("没有找到可以走出此迷宫的路径\n");}/*……………………………建立迷宫……………………………*/void initmaze(int maze[MAXN][MAXN]){ int i, j; int m, n; // 迷宫行,列 printf("请输入迷宫的行数 m="); // 输入迷宫 scanf("%d", &m); printf("请输入迷宫的列数 n="); scanf("%d", &n); printf("\n请输入迷宫的各行各列:\n用空格隔开,0代表路,1代表墙\n", m, n); for (i = 1; i <= m; i++) { for (j = 1; j <= n; j++) scanf("%d", &maze[i][j]); } printf("你建立的迷宫为\n"); for (i = 0; i <= m + 1; i++) // 加一圈围墙 { maze[i][0] = 1; maze[i][n + 1] = 1; } for (j = 1; j <= n; j++) { maze[0][j] = 1; maze[m + 1][j] = 1; } for (i = 0; i <= m + 1; i++) // 输出迷宫 { for (j = 0; j <= n + 1; j++) printf("%d ", maze[i][j]); printf("\n"); }}int main(){ int sto[MAXN][MAXN]; struct mark start, end; // start,end入口和出口的坐标 int add[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; // 行增量和列增量 方向依次为东西南北 initmaze(sto); // 建立迷宫 printf("输入入口的横坐标,纵坐标[空格隔开]\n"); scanf("%d %d", &start.x, &start.y); printf("输入出口的横坐标,纵坐标[空格隔开]\n"); scanf("%d %d", &end.x, &end.y); MazePath(start, end, sto, add); // find path printf("\n");}
效果如下:
看上去没什么问题了,
但是,这种方法无法实现多条路径的打印
所以还是要使用搜索算法
下面,我们使用深度优先搜索来解决这个问题
此处我们使用递归的思想
4.最终版本
解法由:
用一个二维度数组保存这个"迷宫"
1.随后,我们确定起点和终点,
2.先站在起点上,将起点入栈
3.我们开始寻路,按照东南西北(即右下左上)的方向顺序寻找下一坐标
3.1.如果该方向上有路,将下一坐标入栈,"走到"这个坐标上
3.2.如果下一坐标是墙,则进行下一次循环
3.3.如果下一个点是出口,则打印线路
改为
用一个二维度数组保存这个"迷宫"
1.随后,我们确定起点和终点,
2.先站在起点上,将起点入栈
3.寻路方法(){
"走到下一点上"(第一次调用时不做这步)
3.1.开始寻路,按照东南西北(即右下左上)的方向顺序确定下一坐标,
| 3.1.1如果该方向上有路,下一坐标入栈,并标记为2(标记为走过)
| | 3.1.1.1如果下一个点是出口,则打印线路,将下一坐标标记为0,栈顶出栈
| | 3.1.1.2.调用寻路方法
| 3.1.2.开始下一次循环,回到3.1
3.2.出栈,当前点赋值为0
}
核心算法部分实现:
//-----------遍历迷宫寻找路径(dfs)------------void mazePath(int x,int y,int endx,int endy,int n,int m,Stack s){ int newx,newy,i; Node t; for(i=0;i<4;i++){ newx=x+direction[i][0]; newy=y+direction[i][1]; if(newx>=0&&newx=0&&newy
完整代码:
所有路径版本:
#include#include #include #define MAXN 20 /* *建立一个二维数组存迷宫 *要是四个方向能有位置则压入栈,要是下一步没有则弹出栈回溯 *直到找到终点为止*/int direction[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; //定义一个数组存四个方向操作数int MIN=100;//用于记录最小路径 int maze[MAXN][MAXN];int flag=0; //栈中存位置以及遍历时所走的方向,打印时可以显示出来//栈的元素节点 typedef struct Node{ int x; int y; struct Node *next;}Node; typedef Node* Stack; //定义数据结构栈 Stack/*……………………………栈函数……………………………*///-----------创建一个空栈--------------Stack creakEmptyStack(){ Stack p; p=(Stack)malloc(sizeof(Node)); //申请一个空间 if(p){ p->next=NULL; return p; }} //------------将元素压入栈----------------void push(int x,int y,Stack s){ Stack p; p=(Stack)malloc(sizeof(Node)); if(p){ //如果申请空间成功则用头插法将元素压入 p->x=x; p->y=y; if(!s->next) p->next=NULL; //如果此时栈里还没有任何元素,则p此时为第一个结点 else p->next=s->next; //否则将p插入头结点之后 s->next=p; } else{ printf("No space!\n"); }} //-------------检测栈是否为空--------------int isEmpty(Stack s){ //为空则返回1,不为空返回0 if(s->next==NULL) return 1; else return 0;}//--------------将元素弹出栈----------------void pop(Stack s){ Stack p; p=s->next; if(p->next){ s->next=p->next; free(p); } else return;}//------------取栈顶元素------------------Node top(Stack s){ Node t; //判断是否为空,若不为空则返回 t=*(s->next); return t;} void mazePath(int x,int y,int endx,int endy,int n,int m,Stack s);void printPath(Stack s,int n,int m); int main(){ int n,m,i,j,xa,xb,ya,yb,ox; //--------------建立迷宫-------------- printf("请输入迷宫大小:(长、宽)\n"); scanf("%d%d",&n,&m); if(n<=20&&m<=20){ printf("请选择构建迷宫的方式:\n0.随机生成迷宫\n1.手动输入迷宫\n"); //实际上不是0就可以手动输入 scanf("%d",&ox); for(i=0;i =0&&newx =0&&newy next; int i=0,j=0; printf("第%d条路径为:\n",flag); for(i=0;i next){ //将栈中的元素输出为直观路径 printf("(%d,%d)->",s->x+1,s->y+1); s=s->next; cont++; } printf("(%d,%d)",s->x+1,s->y+1); cont++; if(cont
测试样例:
关键词:
-
全球今日讯!祥鑫科技:5月8日接受机构调研,信达证券、华安基金等多家机构参与
2023年5月9日祥鑫科技(002965)发布公告称公司于2023年5月8日接受机构调研,信达证券曹子杰、华安基金刘畅
来源: 世界快看:数据结构与算法大作业:走迷宫程序(C语言,DFS)(代码以及思路)
全球今日讯!祥鑫科技:5月8日接受机构调研,信达证券、华安基金等多家机构参与
天天日报丨谷爱凌:90%网络传言都是假的 不会为负面评价难过
午睡过久会长胖吗?研究发现:午睡时长影响健康 30分钟是关键点-全球最新
曾被称为格力接班人!格力直播间孟羽童视频被删除 天天动态
淄博90后女店主2个月瘦了10斤:1天烤鸡腿上千个 世界快讯
天天热点评!苹果在iPhone 14上挤牙膏!果粉立马用脚投票:好评率跌了
前法鹰主管:当年签镰田大地时他还很年轻,但能力让我想到齐达内
华为云数据库首席专家谈分布式数据应用挑战和发展建议 天天报资讯
如何完整地掌握一个机器学习模型 世界观点
数据结构与算法大作业:走迷宫程序(实验报告)_快资讯
Ubuntu20
你还在纠结怎么选IDE吗?常用IDE工具分享|环球观热点
赛轮轮胎:公司开具的电子商业承兑汇票均已结清|世界速看料
00后男生取名江胡传奇:妈妈姓胡 爸爸喜欢玩《传奇》 每日速读
取代安卓14!OpenHarmony 4.0即将公测:华为鸿蒙4.0“母系统”
世界看点:任天堂开始乱杀!看《塞尔达传说:王国之泪》合法游戏画面也被封
京东APP大升级!12.0上线:应简尽简 营销和弹窗少了_最资讯
1799元 九号平衡车L8奥特曼定制版明日首销:隔壁小孩羡慕哭了
当前速看:金华市东苑小学新生入学网上模拟报名详情2023
SaaS化开源项目之HouseKeeper云上部署实践_每日动态
加要求中方一领事官员离境_中方反制|今日讯
世界视讯!今日欧元/美元汇率行情预测(2023年5月9日)
造车新势力转守为攻!小鹏汽车法务部上线:网络不是法外之地
公司无双休求职者礼貌回拒 HR:想躺平就回老家种地
每日视点!朝日台资深员工游戏氪金过度 年薪1500万仍盗窃公司电脑倒卖
环球今日讯!景区回应功德箱贴收款码:考虑到年轻人很少带现金 与时俱进
乘联会:特斯拉涨价是很好的信号!避免消费者过度期待降价_世界视点
世界快报:广东五华县政府控制的屋顶光伏资源特许经营项目开工
js中的变量 环球速看
JSP_5.8_课堂笔记|世界视点
由浅入深学MySQL之事务全攻略|天天微资讯
微头条丨今天看到博客园的捐款求助,园龄17年6个月的我有些感慨
运营商三要素验证原理,这篇文章就够了!
对话上海国企 | 因科而起、由科而兴、科有所为,上海建科赋能城乡建设新服务
阿坝县气象台发布雷电黄色预警信号【III级/较重】【2023-05-09】 热消息
90元大额券:雪中飞高端含桑蚕丝商务POLO衫49元到手_世界今热点
世界热消息:电脑不怕丢了?鲁大师推出电脑防盗助手:支持定位、丢失锁机
当前报道:中文通用大模型评测基准SuperCLUE发布:讯飞星火认知大模型国内第一 文心一言垫底
《漫长的季节》"爹味"上热搜 部分女性观众:无法共情 全球看热讯
当前视讯!票价20元 全国首条旅游云巴线今日开通:比亚迪100%自主知识产权
精彩看点:广州地铁回应“一夜醒来欠地铁600多万”:乘客及时出站,正查原因
Keycloak 创建和修改自定义用户信息
KubeEdge在边缘计算领域的安全防护及洞察
【吐槽贴】项目经理如何进行高效沟通?_每日消息
【三维CAD软件】上海道宁为您带来国际一流的国产自主可控的三维CAD软件——天工CAD_环球资讯
《边境》之后 中国玩家的国产情怀还能被消费几次?_天天看热讯
周杰伦入职中国移动:工号0716 动感地带至今20年终于“转正”_天天热消息
免费授权歌曲给刘畊宏跳操超大方!周杰伦回应:谈钱伤感情-独家焦点
豆瓣9.4分!《漫长的季节》被吐槽“爹味”浓-当前关注
2023年非京籍四证审核不通过,这些自救方案你一定要提前了解
签名介绍
当前热门:外贸产业集群“掘金”劲头足
峰米激光电视C3来了:ALPD激光显示技术 亮度高达400nit
有望下跌0.33元/升!国内油价下周二晚将迎来调整
当前快报:史上最小发光二极管面世:可让手机摄像头秒变全息显微镜
广东省2023年高校招生平行志愿投档及录取实施办法
SpringBoot的@Configuration注解
安装nginx--银河麒麟V10Kylin Linux
C#自定义异常就这么简单
网关神器traefik的,etcd和https配置例子
一行代码搞定 font-size 响应式
痛别!百岁抗日英雄张友仁逝世
环球热文:比亚迪老对手发威!哈弗枭龙系列上市定档:四驱体验两驱价格
5月上映!迪士尼《小美人鱼》世界首映礼:黑小美人鱼主演亮相
小米稳居中国电视市场第一 国外品牌份额合计不到5%_今日讯
付费会员该在截止日当天几点过期?法院判了
三星、谷歌联手优化:Android 14要彻底告别杀后台了
当前资讯!北斗西虹桥基地:积极打造具有全球影响力的产业集聚高地
快看:品类超全的免费 API 大全整理
五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
开源.NetCore通用工具库Xmtool使用连载 - 散列算法篇|世界视点
Centos7安装MySQL详细步骤(配置开机自启)|天天关注
“五一”假期后机票价格大幅回落 端午出游开始发力 环球热资讯
诺基亚账户怎么注册?诺基亚账户忘记了怎么找回?
【世界独家】入口软糯爽滑 冻颜密码燕窝椰汁3.1元清仓
天天简讯:五一成绩单出炉!河南成为最大赢家
《巨齿鲨2》新海报出炉:吴京、斯坦森直面深海巨鲨 超霸气
上海展会外国人插队领冰淇淋被拒 网友:宝马MINI脸红吗
全球最资讯丨电动“吉姆尼”背个“大手表”!五菱宝骏悦也5月25日上市
怎么将MP4格式转换成RM格式?rm格式用什么播放器打开?
3dmark11怎么看通过率?3dmark11注册码有哪些?
华为p30上市时间和价格是什么?华为p30怎么升级鸿蒙系统3.0?
联想Thinkpad x200什么时候上市的?联想Thinkpad x200电脑参数
烤乳猪是哪个菜系的?烤乳猪的做法与配料是什么?
巴西的世界之最是什么?巴西说什么语言?
中国第四大城市是哪个城市?中国城市GDP排名
和颜悦色的意思是什么?和颜悦色二年级造句
润邦股份:公司一直在积极跟进漂浮式海上风电领域的相关信息
热得快的功率一般是多大?热得快的工作原理是什么?
二季度19省市地方债计划发行规模超1.3万亿元 专家表示今年地方债早发快发特征明显
《漫长的季节》爆火:好观众才配看好剧! 全球速讯
老牌压缩软件7-Zip时隔近一年更新:仅1.5MB
环球热资讯!取代老头乐 新能源车下乡势不可挡 大家对其误解基本消除
疑似红色队服惹祸?公牛闯入橄榄球赛场追逐球员拖行训练员
新动态:好吃饱腹快冲:广州酒家组合粽子9.9元4个 多口味可选
新和成:饲料生产有严格配方比例要求
环球头条:Grafana 系列-统一展示-4-AWS Cloudwatch 数据源
环球最资讯丨Linux驱动开发笔记(二):ubuntu系统从源码编译安装gcc7.3.0编译器
世界热讯:method怎么读音_method怎么读