数据结构课程设计(C语言编写),迷宫问题求解,要求找到出路,并要求获取路径和方向。

一、设计思路:
1.物理存储结构:

① 迷宫数据存储于一个结构体中,数据值放置于二维数组中用0表示通路,数据1表示障碍,走过的路变为-1,行列数分别放于不同的整数。
② 路径存储于一个栈中,最好采用顺序栈存储,采用链栈,队列也可,各有好处,本人选择链栈,减少产生溢出情况。
③ 将路径的点,路径的方向,存放于一个结构体中。

2.逻辑算法:
① 迷宫数组的遍历操作与栈的操作相结合。
② 从入口开始,寻找下一个可同行点,只要可同行,将此刻的方向,坐标进栈,存储信息。
③ 设计循环结构,判断四周是否有路。
While(1){
If(){……}
else if(){……}
else if(){……}
else if(){……}
else{……}
}
先判断四个方向是否为0(此处包括-1走过的路),若都不为零,则出栈,出栈一次后,再取栈顶元素,相当于退后了一步,记住,出栈必须判断是否为空,不然回到原点时,若其他方向有出路,会出现报错情况。
二、技巧:
由于数组可能会产生越界问题,故此得强行设定入口,让编写的迷宫比用户输入的多出四周围墙,这样对迷宫进行数组和栈的操作时,不会出现越界问题。 用户友好型:为了给广大用户增加乐趣,本人设定的迷宫操作,有初始化截面,菜单选择,并且在数字迷宫外,设定了动态迷宫的版本,根据动态迷宫,用户可通过操作方向来确定要走的方向,大大增强了迷宫的交互性和友好性。

三、扩展之处:
设定动态迷宫,增强交互性能。拓展多个模式的用户选择。由于用户按键的不确定性,防止用户操作失误,设定按键失误操作,可选择是否退出。在用户进行游戏的同时,进行清屏,不然会造成乱糟糟一团,影响用户体验。

#include<stdio.h>
#include<malloc.h>
#include<time.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
typedef int datatype;//位置
typedef struct drect {int x, y;int dir;
}drect;//栈
typedef struct node {struct drect data;struct node* next;
}node;//初始化一个栈
node* first()
{node* p = (node*)malloc(sizeof(node));p->next= NULL;return p;
}//进栈
void push(node* s, int x, int y, int dir) {node* p =(node*)malloc(sizeof(node));p->data.x = x;p->data.y = y;p->data.dir = dir;p->next = s->next;s->next = p;//return s;
}//出栈
node* output(node* s, int x, int y, int dir) {if (s== NULL)return 0;node* p ;p = s->next;s->next = p->next;return p;
}//创建地图
void creatmap(int a[][100], int x, int y) {int k;srand(time(0));for (int i = 0; i < x; i++) {for (int j = 0; j < y; j++) {if (i == 0 || i == x - 1) {a[i][j] = 1;}if (j == 0 || j == y - 1) {a[i][j] = 1;}else if ((i != 0 && i != x - 1) && (j != 0 && j != y - 1)) {a[i][j] = 0;}}}for (int i = 1; i < x - 1; i++) {for (int j = 1; j < y - 1; j++) {if (j < y / 3) {//规范随机数个数产生数量k = rand() % (y - 1);a[i][k] = 1;}}}
}//寻找出路
//right 1 under 2 left 3 on 4
int find(node*s , int a[][100], int w, int  h, int  x1, int y1, int x2, int y2, int x, int y)
{node* p;int dir;// = 1;push(s, 1, 0, 1);while ((x!=x2||y!=y2)&& (x != x1 || y != y1)){if ( a[x][y + 1] == 0) {a[x][y] = -1;dir = 1;push(s, x, y, dir); y++;}else if ( a[x + 1][y] == 0) {a[x][y] = -1;dir = 2;push(s, x, y, dir);x++;}else if ( a[x][y - 1] == 0) {a[x][y] = -1;dir = 3;push(s, x, y, dir);y--;}else if ( a[x - 1][y] == 0) {a[x][y] = -1;dir = 4;push(s, x, y, dir);x--;}else{a[x][y] = -1;p = output(s, x, y, dir);if (p) {x = p->data.x;y = p->data.y;dir = p->data.dir;free(p);}}}if (x == x2 && y == y2) {push(s, x, y, 0);return 1;}return 0;}void print_map(int a[][100],int w,int h) {printf("迷宫为:\n");for (int i = 0; i < w + 2; i++) {for (int j = 0; j < h + 2; j++) {a[1][0] = 0;a[1][1] = 0;a[w + 1][h] = 0;printf("%d ", a[i][j]);}printf("\n");}
}void print_foot(node* s,int i) {if (i) {printf("迷宫为:\n");while (s->next != NULL) {s = s->next;int a = s->data.x;int b = s->data.y;int c = s->data.dir;printf("(%d,%d)->%d\n", a, b, c);}}elseprintf("没有出口!\n");
}///以下为动态迷宫游戏!!int find_run_foot(char hyb[][200]) {int x = 1, y = 1;char ch;//hyb[1]=" ";for (int i = 0; i <= 20; i++){puts(hyb[i]);}hyb[1][0] = ' ';while (1){ch = _getch();if (ch == 's') {if (hyb[x + 1][y] == ' ') {hyb[x][y] = ' ';x++;hyb[x][y] = 'o';}}else if (ch == 'w') {if (hyb[x - 1][y] == ' ') {hyb[x][y] = ' ';x--;hyb[x][y] = 'o';}}else if (ch == 'a') {if (hyb[x][y - 1] == ' ') {hyb[x][y] = ' ';y--;hyb[x][y] = 'o';}}else if (ch == 'd'){if (hyb[x][y + 1] == ' ') {hyb[x][y] = ' ';y++;hyb[x][y] = 'o';}}else {system("cls");printf("其他按键会退出游戏,你是否继续?1-是,其他-否\n");int dle;scanf_s("%d", &dle);system("cls");if (dle == 1) {break;}else{system("cls");for (int i = 0; i <= 20; i++){puts(hyb[i]);}continue;}}system("cls");for (int i = 0; i <= 20; i++){puts(hyb[i]);}if (x == 19 && y == 27){break;}}system("cls");Sleep(1000);printf("游戏结束!\n");system("cls");return 0;
}int run_foot(int slect_slect) {char hyb1[200][200] = {"############################","o  ### ## ### ## ###########","##   ####          #########","### #### ## ###### ###    ##","### ###  ######### ### ## ##","###         ###### ### ## ##","### ## #### ######     ## ##","#   ## ####   ########### ##","# ####     ## ######      ##","###    ### ##  ##### #######","### ###### ###     #      ##","#   ######    #### ###### ##","# # ###### ####### #### # ##","# #     ##      ## #### # ##","# ##### ## #### ##        ##","#    ## ## #### ######  # ##","#### ## ## ##      #### # ##","#    ## ##    ## ##   # #  #","# ##### ## ##### ## # # ####","#   #     ######    # #     ","############################",};char hyb2[200][200] = {"############################################################################","o    # ## ### #  ####     ##### ###### #### ####### ##### #### ## ### ######","##    ##    ####        #         ###      #       ##### #### ## ### #######","##### ## ### ### ##### ###  ## ## ### # ## ####### ##### #### ## ### ###   #","##         # ### ##### ###  ## ## ### # ## ##            #### ## ### ###  ##","## ## ## # # ### ##### #  #### ## ### #  # ## #### ### #   ## ## ### ### ###","##### ## #     # ##### ###  ## ##   # ##  ## ## ##  ## ###        ## ### ###","## ## ## ### # # ##        # ## ### #### ## ####    ### #### ## # # ###  ###","## ## ## ### # # ## ## ### #                #### ###  ## #### ##   # #  ####","## #####   ### # # ## ## #   # ###### ####       # ###  ## #### ## #   #####","## ## ## ### #      ## #  ## ###### #### #######             # # #   #######","## ## ## #  ## # # ###  ## ##  # ##   # #### ####### # ### #    ## # # #####","## ##### ### ### #  #### ### # ## # # #### ##   ## ###  ## ## #    # # #####","## ## ## ### ### ##### ### # ## # # #### ### ### ##### #  # # ## # # #######","## ## ## ### #  ## ##### #   # ## # # #### ##   ## ####  # ##   ##      ####","## ## ## ###  ## ##### ## ## ## # #        ###   ##   ####    ####  ####  ##","## ## ## ##  #  ## ##### ## ## ## # # ## ##  ##  #####   #####         #####","## #####   ### ### ##### ## ## ## # # #### #####   #        # ## ### #    ##","## ## ###### ### ##    ## ## ## # # ####      ## ##  # # ## ##   # #      ##","## ## ## ### ### ## ##  # ##    #   #### #### ## ## ## # ##     ## #####    ","############################################################################",};char hyb[200][200];for (int i = 0; i < 200; i++) {for (int j = 0; j < 200; j++) {if (slect_slect == 1) {hyb[i][j] = hyb1[i][j];}else if (slect_slect == 2) {hyb[i][j] = hyb2[i][j];}}}find_run_foot(hyb);return 0;
}//主函数
int main()
{printf("-------欢迎来到迷宫小游戏------\n");printf("------------版本1.0------------\n");printf("------------vs2019下运行---------------\n");printf("说明:本游戏要时间加载,请耐心等待!\n");Sleep(500);system("cls");printf("抵制不良游戏,做优秀的联大学子!\n");printf("作者:黄渝斌(北京联合大学),计算机科学与技术专业\n");printf("游戏说明:抵制不良游戏,做优秀的联大学子!\n");printf("本游戏源代码将上传博客CSDN,搜索用户“梵高的猪v”,借用原代码请标明出处!\n");Sleep(1000);system("cls");printf("等待游戏中………………\n");printf("游戏说明:用户请先初始化一个迷宫,然后根据自己需要是否要进行其他选择!\n");Sleep(1000);system("cls");node* s;s = first();int    a[100][100];int week;int w, h;int x1 = 1, y1 = 0,x2,y2, x = 1, y = 1;int count = 0;int slect;while (1) {printf("--------请选择版本型号----------\n");printf("--------1-静态迷宫1.0-----------\n");printf("--------2-动态迷宫1.0--------\n");printf("--------0-退出游戏-----------\n");printf("请输入版本型号:\n");scanf_s("%d",&slect);system("cls");if (slect == 1) {while (1) {printf("-------1-初始化迷宫------------\n");printf("-------2-打印迷宫--------------\n");printf("-------3-出路迷宫--------------\n");printf("-------0-退出游戏--------------\n");printf("请输入你要选择的功能:\n");scanf_s("%d", &week);system("cls");if (week == 1) {printf("请输入你要创建的迷宫大小:\n");scanf_s("%d%d", &w, &h);creatmap(a, w + 2, h + 2);count++;}else if (week == 2) {if (count > 0) {print_map(a, w, h);count++;}else {printf("请先初始化一个迷宫!\n");Sleep(1000);system("cls");continue;}}else if (week == 3) {if (count > 0) {x2 = w + 1;y2 = h;int i = find(s, a, w, h, x1, y1, x2, y2, x, y);print_foot(s, i);count++;}else {printf("请先初始化一个迷宫!\n");Sleep(1000);system("cls");continue;}}else if (week == 0) {system("cls");printf("---------------游戏结束!--------------\n");Sleep(1000);break;}int m;printf("请选择是否执行程序!\n");printf("1-true,0-fasle\n");scanf_s("%d", &m);system("cls");if (m == 1) {continue;}elsesystem("cls");printf("---------------游戏结束!--------------\n");Sleep(1000);break;}}else if (slect == 2) {int slect1;printf("游戏说明:该游戏控制的方向如下:w(上)s(下)a(左)d(右)。\n若无法移动,可按住alt键在进行操作!\n");Sleep(1000);system("cls");printf("------------请输入选项!----------\n");printf("------------1-简单模式------------\n");printf("------------2-困难模式------------\n");printf("           ……                \n");printf("------------0-退出游戏------------\n");scanf_s("%d",&slect1);system("cls");if (slect1 == 1) {run_foot(1);continue;}else if (slect1 == 2) {run_foot(2);continue;}else if (slect1 == 0) {continue;}else {printf("-----其他选项待开发!----");Sleep(1000);continue;}}else if(slect==0){break;}else {printf("其他大型迷宫待开发中!");continue;}}return 0;
}

数据结构课程设计,迷宫问题求解相关推荐

  1. 数据结构迷宫代码_数据结构课程设计——迷宫求解(二)

    前言 接上文的介绍,本文将主要介绍如何生成随机迷宫,在网上找到的资源也比较多,这里我选取了随机 Prim 算法生成迷宫,选择这个算法的理由如下: 算法思想简单,易于实现 生成的迷宫比较自然,不会出现明 ...

  2. 数据结构课程设计——迷宫问题课程设计报告

    上学时没学过数据结构和算法,于是现在有机会就自学.下面是我最近在等待进入项目组期间,花了1小时学习了一下迷宫问题.下面是我学习时找到的一篇课程设计的报告,然后自己先看懂,然后又在VC6.0下运行了. ...

  3. 数据结构课程设计 迷宫问题

    文章目录 一. 目的与要求 二. 问题描述和求解方法 三. 解题过程 四. 实现源码 五. 相关案例 案例一 案例二 一. 目的与要求 1.目的: 通过布置具有一定难度的实际程序设计项目,使学生进一步 ...

  4. 《数据结构与算法分析》课程设计——迷宫问题

    中国矿业大学信控学院   补一下我之前在博客园发布的内容  懒得调了,想复制完整代码直接复制最下面的,想复制分布代码去看我博客园链接吧 <数据结构与算法分析>课程设计--迷宫问题 - 刷子 ...

  5. C/C++数据结构课程设计安排

    C/C++数据结构课程设计安排 数据结构课程设计安排 课程设计学时:32学时 课程设计目的:综合应用数据结构课程中所学的数据结构:线性表.栈.队列.数组.广义表.树.二叉树.图.查找表中的一种或多种数 ...

  6. 大学数据结构课程设计题目

    数据结构课程设计题目 1.         飞机订票系统(限1 人完成) 任务:通过此系统可以实现如下功能: 录入: 可以录入航班情况(数据可以存储在一个数据文件中,数据结构.具体数据自定) 查询: ...

  7. 数据结构课程设计--农夫过河

    农民过河 [摘要] 农民问题即一个农民带着一只狼.一只羊和一棵白菜,身处河的南岸,他需要把这些东西全部运到河的北岸.而他只有一条小船,且这只小船小到只能容下他和一件物品,另外只有农民能撑船.农民不能留 ...

  8. c语言程序设计迷宫,C语言程序设计课程设计-迷宫.doc

    C语言程序设计课程设计-迷宫 大 学 C语言程序设计 课程设计(论文) 题目: 迷宫问题 院(系): 专业班级: 学 号: 学生姓名: 指导教师: 教师职称: 讲 师 起止时间: 2009.12.14 ...

  9. 数据结构课程设计——机票售卖系统(C++)

    引言 这学期最后的数据结构课程设计需要我们完成一个简单的小程序,我选择了一个机票售卖系统,实现了一些基本的功能:因为时间给的比较短,又赶在复习周补课,所以并没有什么突出的地方,我就在这里聊聊我的代码实 ...

  10. 数据结构课程设计---最长公共子串

    数据结构课程设计,由用户输入两个字符串串X和Y,再由用户输入一个任意的字符串Z,实现以下功能: ①如果字符串Z是字符串X的子串,则显示Z在X中的位置并记录,如果字符串Z是字符串Y的子串,则显示Z在Y中 ...

最新文章

  1. java.sql.SQLException: Zero date value prohibited 报错分析
  2. excel vba 调用webbrowser_Python杀死Excel?我只会用Python来增强Excel!
  3. (一)Eureka搭建服务注册中心
  4. 在Ubuntu8.04上简单定制个性化的Terminal操作界面
  5. 为什么不能把CSS放到html中,为什么我的CSS代码不能在我的HTML文件中工作?
  6. 订单编号的数据类型是什么_领域模型与代数数据类型(第三期)
  7. azw3转换为pdf_怎么合并几个PDF为一个?快用这个PDF转换器!
  8. Bootstrap页面布局18 - BS导航路径以及分页器
  9. docker的安装--基于docker1.6
  10. mysql非阻塞通信协议_NIO 的非阻塞式网络通信
  11. 博客园9月份第3周51Aspx源码发布详情
  12. NOKIA PC 套件导入(import)CSV格式联系人列表
  13. qt 设置焦点 跳到下个控件_Qt控件焦点切换
  14. APS系统到底是什么?为什么许多企业纷纷选择APS系统?
  15. 川大博士生被华为以200万年薪录用!分享以下科研及论文写作经验
  16. Resources Root目录和Sources Root目录的区别
  17. 力扣--阿拉伯转数字
  18. matlab 画折线图,matlab 双坐标折线图画法
  19. java毕设项目车牌号码识别系统开源了,很好玩,建议尝试
  20. 【捡米通】网络赚钱,钱死磕才是王道!

热门文章

  1. 【优化模型】逐步回归算法
  2. PWA 应用列表及常用工具
  3. Unity美术字体教程--BMFont美术字体的制作流程以及在unity中美术字体的生成
  4. 两个平面的位置关系和判定方程组解_2018年高考数学总复习第九章平面解析几何第2讲两直线的位置关系学案!...
  5. 快速搭建一个前端模板
  6. Unity 基础纹理
  7. WINCC冗余、上位机冗余详细教程
  8. CAD2020操作手册
  9. 解决:error C1083: 无法打开包括文件: “opencv2/opencv.hpp”: No such file or directory
  10. 手艺人舍bpftrace而取systemtap的代价和思考