博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深度优先迷宫求解实例(C)
阅读量:5963 次
发布时间:2019-06-19

本文共 4014 字,大约阅读时间需要 13 分钟。

//maze.h#define RIGHT 0#define DOWN  1#define LEFT  2#define UP    3typedef struct Position{  //位置    int x; //行    int y; //列}Position;//顺时针从右开始寻找临近位置,返回该临近位置Position NextPos(Position now, int dir){    Position next;    int x = now.x;    int y = now.y;    switch(dir){        case RIGHT: next.x = x; next.y = y+1; break; //向右走一格        case DOWN:  next.x = x+1; next.y = y; break; //向下走一格        case LEFT:  next.x = x; next.y = y-1; break; //向左走一格        case UP:    next.x = x-1; next.y = y; break; //向上走一格    }    return next;}
//mazeStack.h#include 
#include
#include "maze.h"#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define MAXSIZE 1000typedef int Status;//存入栈中的元素typedef struct Ele{ Position pos; //当前位置 int step; //当前步数 int dir; //当前方向}Ele;typedef struct{ int Stacksize; Ele* top; Ele* base;}Stack;//创建一个栈,返回该栈。创建失败返回NULLStack* InitStack(void){ Stack* s = (Stack*)malloc(sizeof(Stack)); s->base = (Ele*)malloc(STACK_INIT_SIZE*sizeof(Ele)); if(!s->base){ //内存分配失败 printf("内存分配失败!\n"); return NULL; } else{ s->top = s->base; s->Stacksize = STACK_INIT_SIZE; return s; }}//判断栈是否为空,是返回1,否返回0int IsStackEmpty(Stack* s){ if(s->top == s->base) return 1; else return 0;}//获取栈的长度,返回长度int StackLength(Stack* s){ return s->top - s->base;}//将元素e入栈,成功返回1,失败返回0int Push(Stack* s, Ele e){ if(StackLength(s)>=s->Stacksize){ //栈满,追加存储空间 s->base = (Ele*)realloc(s->base,(s->Stacksize + STACKINCREMENT)*sizeof(Ele)); if(!s->base) return 0; s->top = s->base + s->Stacksize; s->Stacksize += STACKINCREMENT; } *(s->top)++ = e; return 1;}//弹出栈顶元素返回给e。成功返回1,失败返回0。int Pop(Stack* s, Ele* e){ if(IsStackEmpty(s)) return 0; *e = * --s->top; return 1;}//若栈不空,则用e返回S的栈顶元素,并返回1,否则返回0int GetTop(Stack* s, Ele* e){ if(IsStackEmpty(s)){ return 0; } *e = *(s->top-1); return 1;}
#include 
#include "mazeStack.h"//输出迷宫地图void PrintMaze(int maze[10][10]){ int i,j; for(i=0;i<10;++i){ for(j=0;j<10;++j){ switch(maze[i][j]){ case 0: printf(" "); break; //0表示可走的格子 case -2: printf("#"); break; //-2表示不可走的障碍物 case -1:printf(" "); break; //-1表示探索过的格子 default:printf("*"); break; //1至正无穷表示迷宫解的顺序对应的格子 } } printf("\n"); }}int main(void){ int exist = 1; //迷宫是否有解.1代表有解,0代表无解。 Stack* path = InitStack();//记录路径 if(path == NULL) exit(-1); Position now; //当前位置 //初始化位置为入口 now.x = 1; now.y = 1; int step=2; //初始步数设为1 int maze[10][10] = {
{-2,-2,-2,-2,-2,-2,-2,-2,-2,-2}, //建立迷宫 {-2,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-2}, {
-2,0 ,-2,0 ,-2,0 ,-2,0 ,-2,-2}, {
-2,-2,-2,0 ,-2,-2,-2,0 ,0 ,-2}, {
-2,0 ,0 ,0 ,-2,0 ,0 ,0 ,-2,-2}, {
-2,0 ,-2,0 ,0 ,0 ,-2,0 ,-2,-2}, {
-2,0 ,-2,-2,-2,-2,-2,-2,-2,-2}, {
-2,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-2,-2}, {
-2,-2,0 ,-2,0 ,-2,-2,0 ,0 ,-2}, {
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2},}; PrintMaze(maze); //输出迷宫 while(1){ if(maze[now.x][now.y]==0){ //若当前格子可走 maze[now.x][now.y]=step;//走进这个格子 Ele e; //初始化一个e e.dir = RIGHT; //初始方向向右 e.pos.x = now.x; //e的位置即当前格子 e.pos.y = now.y; e.step = step; //e记录的步数即为当前步数 Push(path,e); //将e入栈(当前格子加入路径) if(now.x==8 && now.y==8) break; //若到达终点,则退出循环 now = NextPos(now,e.dir); //试探下一个格子 step++; //步数+1 } else{ //若当前格子不可走 if(!IsStackEmpty(path)){ Ele e; Pop(path,&e); //栈顶元素出栈,赋值给e step--; //步数-1 if(e.dir

运行截图:

 

 

转载于:https://www.cnblogs.com/zhouyifeng/p/7846521.html

你可能感兴趣的文章
Mybatis调用Oracle中的存储过程和function
查看>>
telnet :No route to host
查看>>
基本安装lnmp环境
查看>>
yum源资料汇总
查看>>
7、MTC与MTV,http请求介绍
查看>>
logstash消费阿里云kafka消息
查看>>
第四节课作业
查看>>
EasyUI Calendar 日历
查看>>
Oracle 索引
查看>>
数据库复习
查看>>
unix 环境高级编程
查看>>
为数据库建立索引
查看>>
第二周作业-软件工作量的估计
查看>>
我的wordpress插件总结
查看>>
MAXIMO 快速查找实现
查看>>
Oracle——条件控制语句
查看>>
[Linux][Redis][05]Benchmark
查看>>
第一次作业-准备篇
查看>>
HDU1848 Fibonacci again and again
查看>>
HTML思维导图
查看>>