曾经用C语言做过的动态走迷宫程序,先分享代码如下:

代码如下:

 //头文件
#include<stdio.h>
#include<windows.h>//Sleep(500)函数调用此头文件
#include<conio.h>//getch()函数调用此头文件
#include<stdlib.h>//system("cls")函数调用此头文件 //函数状态码定义
/******************************/
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define Pass 0 //可通过
#define Wall 1 //墙
#define Start 6 //起点
#define End 7 //终点
#define Back 8 //返回
#define Exit 9 //出口:找到终点后标志出来
/******************************/ //自定义数据类型
/***************************************************/ //自定义枚举类型
enum direction{East=,South,West,North};//2,3,4,5分别代表东、南、西、北
/*+------------------------
使用枚举类型来表示方向
该枚举类型定义的变量只能取值 East,West,South,North
且East=2,South=3,West=4,North=5
本源码上面使用枚举类型,基本等效于下面
#define East 2
#define South 3
#define West 4
#define North 5
+------------------------*/ //自定义坐标结构体
typedef struct //迷宫x行,y列
{
int x;
int y;
}Position;//坐标结构体 //二维数组构造迷宫,1代表墙,0代表可通过。
int Map[][]={
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,}
}; //自定义结构体作为中间变量保存当前临时坐标信息
typedef struct
{
int number;//记录是第几步
Position seat;//通道块在迷宫中的"位置坐标"
enum direction direc;
//direction为枚举类型,用来表示从此通道走向下一通道的方向
//direc只能取值 East,West,South,North
//且East=2,South=3,West=4,North=5
}SElemType; //自定义栈结构便于将上面结构体的临时坐标信息放到栈内存储
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;//栈
/*********************************************/ //函数声明
/******************************************/ void Welcome();//欢迎界面函数
void printfMap();//打印迷宫函数
Status findPath(SqStack &S,Position start,Position end);//迷宫寻路径函数
Status InitStack(SqStack &S);//初始化栈
Status StackEmpty(SqStack S);//判断栈是否为空
Status Push(SqStack &S,SElemType e);//入栈
Status Pop(SqStack &S,SElemType &e);//出栈
enum direction Judge_direc(Position pos);//根据一个坐标探索周围坐标返回可通行的坐标
Position change_seat(Position &pos,enum direction direc);//根据方向移动到下一个可通行的坐标处
Status change_Map(int mapid); /****************主函数开始***********************/ //主函数
int main()
{
Position start,end;
int n;
SqStack S;
InitStack(S);//初始化栈
Welcome();//调用欢迎界面函数
start.x=;//
start.y=;//
printf("请选择地图:\n\n");
change_Map();
printf("\t\t默认地图0\n\n");
printfMap();
change_Map();
printf("\t\t备选地图1\n\n");
printfMap();
printf("选择默认地图请输入0,备选地图请输入1:\n");
printf("您的选择:");
scanf("%d",&n);
system("cls");
switch(n)
{
case :
{
change_Map();printf("初始迷宫如下所示:\n\n");
end.x=;end.y=;
printfMap();
printf("按任意键继续!");
getch();
system("cls");
break;
}
case :
{
change_Map();printf("初始迷宫如下所示:\n\n");
end.x=;
end.y=;
printfMap();
printf("按任意键继续!");
getch();
system("cls");
break;
}
}
findPath(S,start,end);
printf("\n\n按下任意键退出系统!\n");
getch(); return ;
}
/***************主函数结束***********************/
//打印迷宫
void printfMap()
{
int i,j;
for(i=;i<;i++)
{
printf("\t");
for(j=;j<;j++)
switch(Map[i][j]){
case Pass:printf("□");break;//可通过0
case Wall:printf("■");break;//墙1
case East:printf("→");break;//东2
case South:printf("↓"); break;//南3
case West:printf("←");break;//西4
case North:printf("↑");break;//北5
case Start:printf("⊙");break;//起点6
case End:printf("◎");break;//终点7
case Back:printf("Θ");break;//返回8
case Exit:printf("To");break;//出口9
}
printf("\n");
}
printf("\n");
} //走迷宫
Status findPath(SqStack &S,Position start,Position end){
Position curpos;//当前坐标
SElemType elem;//路径相关信息结构体
int step=;//记录步骤数
curpos=start;//开始坐标
while(){
if(curpos.x==start.x&&curpos.y==start.y)//此段代码只执行一次
{
elem.number=;
elem.direc=Judge_direc(curpos);//判断下一个位置是什么方向
elem.seat=curpos;
step++;
Push(S,elem);//第一个起点无条件入栈
} Map[curpos.x][curpos.y]=(int)elem.direc;//锁定当前位置
curpos=change_seat(curpos,elem.direc);//移动到下一个位置,根据方向改变坐标位置
if(Map[curpos.x][curpos.y]==End)//找到终点,退出循环
{
elem.seat=curpos;
elem.number=step;
Push(S,elem);
Map[curpos.x][curpos.y]=Exit;
system("cls");
printf("\n");
printfMap();
printf("\n\t恭喜您,迷宫路径已经找到!\n\n");
printf("路径坐标为:\n\n");
while(!StackEmpty(S))
{
Pop(S,elem);//出栈
curpos=elem.seat;
printf("(%d,%d)\t",curpos.x,curpos.y);
}
break;
}
if(Map[curpos.x][curpos.y]==Pass)//如果当前路可通
{
elem.number=step;
elem.seat=curpos;
elem.direc=Judge_direc(curpos);
Push(S,elem);//将当前坐标入栈
step++;
}
else//如果当前位置不通
{
Pop(S,elem);
curpos=elem.seat;
step=elem.number-;
Map[curpos.x][curpos.y]=Back;//表示四个都不通,标记走过了
do
{
Pop(S,elem);//出栈
curpos=elem.seat;
/************while循环开始*****************/
while(elem.direc<=)
{
elem.direc=(enum direction)(elem.direc+);
curpos=change_seat(curpos,elem.direc);//移动到下一个位置,根据方向改变坐标位置
if(Map[curpos.x][curpos.y]==Pass)
{
break;
}
};
/************while循环结束*****************/
if(Map[curpos.x][curpos.y]==Pass)
{
curpos=elem.seat;
elem.number=step;
elem.seat=curpos;
Push(S,elem);
step++;
break;
}
else
{
curpos=elem.seat;
Map[curpos.x][curpos.y]=Back;
}
printf("正在遍历查找...\n\n");
printfMap();
Sleep();
system("cls");
}while(!StackEmpty(S));//直到栈为空跳出循环
}
printf("正在遍历查找...\n\n");
printfMap();
Sleep();
system("cls");
}
return OK;
} //改变坐标
Position change_seat(Position &pos,enum direction direc){
switch(direc)
{
case East: pos.y=pos.y+;break;//
case South: pos.x=pos.x+;break;//
case West: pos.y=pos.y-;break;//
case North: pos.x=pos.x-;break;//
}
return pos;
}
//判断下一个位置方向
enum direction Judge_direc(Position pos)
{
enum direction judge;
if(Map[pos.x][pos.y+]==Pass||Map[pos.x][pos.y+]==End)
judge=East;
else
{
if(Map[pos.x+][pos.y]==Pass||Map[pos.x+][pos.y]==End)
judge=South;
else
{
if(Map[pos.x][pos.y-]==Pass||Map[pos.x][pos.y-]==End)
judge=West;
else
{
if(Map[pos.x-][pos.y]==Pass||Map[pos.x-][pos.y]==End)
judge=North;
}
}
}
return judge;
} Status change_Map(int mapid)
{
if(mapid==)//默认地图
{
Map[][]=Wall;
Map[][]=End;
}
if(mapid==)//其他地图
{
Map[][]=Wall;
Map[][]=End;
}
return OK;
} //初始化栈
Status InitStack(SqStack &S){
S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
} //判断栈是否为空
Status StackEmpty(SqStack S){
if(S.top==S.base)
return TRUE;
else
return FALSE;
}
//入栈
Status Push(SqStack &S,SElemType e){
if(S.top-S.base>=S.stacksize){
S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.base+=STACKINCREMENT;
}
*S.top++=e;
return OK;
} //出栈
Status Pop(SqStack &S,SElemType &e){
if(S.top==S.base)return ERROR;
e=*--S.top;
return OK;
}
//去栈顶元素
Status GetTop(SqStack S,SElemType &e){ if(S.top==S.base)return ERROR; e=*(S.top-); //注意top指向待插入位置 return OK; } //欢迎界面函数
void Welcome(){
system("title 迷宫求解程序");//设置窗口标题
system("mode con cols=80 lines=40"); //窗口宽度高度
system("color a");//设置文本颜色,所在头文件
printf("★**************************************************************★\n");
printf("★ ★\n");
printf("★ 欢迎使用迷宫求解程序 ★\n");
printf("★ ★\n");
printf("★ 文件名称:数据结构期末实验 ★\n");
printf("★ ★\n");
printf("★ 项目名称:迷宫求解程序 ★\n");
printf("★ ★\n");
printf("★ 创建时间:2014-11-28 ★\n");
printf("★ ★\n");
printf("★ 最后修改时间:2014-12-2 ★\n");
printf("★ ★\n");
printf("★**************************************************************★\n");
printf("按任意键继续!\n");
getch();//暂停函数,所在头文件<conio.h>
system("cls");//清屏函数
}

C语言动态走迷宫的更多相关文章

  1. C语言之走迷宫深度和广度优先(利用堆栈和队列)

    完成以下迷宫 利用二维数组储存每一个数组里的值,若是不能走则为1,若是可行就是0,走过了就设为2. 一般是再复制一个数组,用来记录. 堆栈的思想就是将一个点的上下左右都遍历一遍,若可行进栈,跳出遍历, ...

  2. 百炼3752:走迷宫--栈实现dfs

    3752:走迷宫 总时间限制:  1000ms 内存限制:  65536kB 描述 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走.给定一个迷宫,求从左上角走到右下角最 ...

  3. sdut 2449走迷宫【最简单的dfs应用】

    走迷宫 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_ 题目描述 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m) ...

  4. Rmarkdown用法与R语言动态报告

    Rmarkdown用法与R语言动态报告数据分析用R语言非常便捷,因为R语言的社区强大,并且在不断更新和完善,提供了各种分析利器.Knitr和Rmarkdown包则是数据分析中的动态报告利器. 下面是一 ...

  5. 洛谷P1238 走迷宫

    洛谷1238 走迷宫 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个 ...

  6. BZOJ 2707: [SDOI2012]走迷宫( tarjan + 高斯消元 )

    数据范围太大不能直接高斯消元, tarjan缩点然后按拓扑逆序对每个强连通分量高斯消元就可以了. E(u) = 1 + Σ E(v) / degree(u) 对拍时发现网上2个程序的INF判断和我不一 ...

  7. NYOJ306 走迷宫(dfs+二分搜索)

    题目描写叙述 http://acm.nyist.net/JudgeOnline/problem.php?pid=306 Dr.Kong设计的机器人卡多非常爱玩.它经常偷偷跑出实验室,在某个游乐场玩之不 ...

  8. Problem A: 走迷宫问题

    Problem A: 走迷宫问题Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 9 Solved: 3[Submit][Status][Web Board] ...

  9. BZOJ 2707: [SDOI2012]走迷宫 [高斯消元 scc缩点]

    2707: [SDOI2012]走迷宫 题意:求s走到t期望步数,\(n \le 10^4\),保证\(|SCC| \le 100\) 求scc缩点,每个scc高斯消元,scc之间直接DP 注意每次清 ...

随机推荐

  1. 微信应用号(小程序)开发IDE配置(第一篇)

    2016年9月22日凌晨,微信宣布“小程序”问世,当然只是开始内测了,微信公众平台对200个服务号发送了小程序内测邀请.那么什么是“小程序”呢,来看微信之父怎么说 看完之后,相信大家大概都有些明白了吧 ...

  2. SQLSERVER走起微信公众帐号已经开通搜狗微信搜索

    SQLSERVER走起微信公众帐号已经开通搜狗微信搜索 请打开下面链接 http://weixin.sogou.com/gzh?openid=oIWsFt-hiIb_oYqQHaBMoNwRB2wM ...

  3. SQL Server2014 SP2新增的数据库克隆功能

    SQL Server2014 SP2新增的数据库克隆功能 创建测试库 --创建测试数据库 create database testtest use testtest go --创建表 )) --插入数 ...

  4. 【组织级项目管理】P2 MSP P3O

    组织级项目管理--有你,有我,有大家 在过去的2年,无论对于企业来讲,还是对于我们个人都有很多大脑的冲击,有几个词大家应该特别耳熟能详:转型,变革,敏捷,互联网+,组织的项目化管理等.就是这些让我们的 ...

  5. 数据库的快照隔离级别(Snapshot Isolation)

    隔离级别定义事务处理数据读取操作的隔离程度,在SQL Server中,隔离级别只会影响读操作申请的共享锁(Shared Lock),而不会影响写操作申请的互斥锁(Exclusive Lock),隔离级 ...

  6. javaScript的原型继承与多态性

    1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...

  7. javascript数组查重方法总结

    文章参考地址:http://blog.csdn.net/chengxuyuan20100425/article/details/8497277 题目 对下列数组去重: var arr = ['aa', ...

  8. [Egret]优雅的写http

    首先,自从使用链式调用的写法后,就一发不可收拾的喜爱上了这种优雅的方式.不管是写架构还是写模块,我都会不自觉的使用这种最优雅的方式.链式写法既减少了代码量,又非常优雅的. 在使用 egret 的htt ...

  9. [算法]——归并排序(Merge Sort)

    归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...

  10. 使用rowid抽取数据方法以及大数据量游标卡住的应对

    平时工作的时候,经常会遇到这种事情,从一个大表A中,抽取字段a在一个相对较小B的表的数据,比如,从一个详单表中,抽取几万个用户号码的话单出来.这种时候,一般来说, 做关联查询: create tabl ...