C语言通过栈实现小人走迷宫

 更新时间:2022年03月02日 09:49:10   作者:reg183  
这篇文章主要为大家详细介绍了C语言通过栈实现小人走迷宫,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C语言通过栈实现小人走迷宫的具体代码,供大家参考,具体内容如下

新建stack.h

#include "Data.h"
#ifndef _STACK_H
#define _STACK_H
#define INIT_SIZE 10
#define INIT_INCREM 10
typedef struct _STACK{
    ElemType *Base;
    ElemType *Top;
    int size;
} STACK;
STACK* InitStack();
void DestroyStack(STACK* s);
//压栈
int Push(STACK* s, ElemType *e);
//弹栈
int Pop(STACK* s, ElemType* e);
//站是否为空
int IsEmpty(STACK*  s);
#endif;

新建stack.c

#include "stack.h"
#include<stdlib.h>

STACK* InitStack(){
    STACK* s = (STACK*)malloc(sizeof(STACK));
    if (s == NULL){
        exit(0);
    }
    s->Base = (ElemType*)malloc(INIT_SIZE*sizeof(ElemType));
    if (s->Base == NULL){
        free(s->Base);
        free(s);
        exit(0);
    }
    s->Top = s->Base;
    s->size = INIT_SIZE;
    return s;
}

void DestroyStack(STACK* s){
    free(s->Base);
    free(s);

}


int Push(STACK* s, ElemType *e){
    if (s == NULL || e==NULL){
        return 0;
    }

    if (s->Top - s->Base >= s->size){
        s->Base = (ElemType*)realloc(s->Base, (s->size + INIT_INCREM)*sizeof(ElemType));
        if (s->Base == NULL){
            return 0;
        }
        s->Top = s->Base + s->size;

        s->size = s->size + INIT_INCREM;
    
    }

    
    *s->Top = *e;
    s->Top++;
    return 1;
}

int Pop(STACK* s, ElemType* e){
    if (s == NULL || e==NULL){
        return 0;
    }

    if (s->Base == s->Top){
        return 0;
    }
    s->Top--;
    *e = *s->Top;
    return 1;
}

int IsEmpty(STACK*  s){
    return s->Base == s->Top ? 1 : 0;
}

新建Data.h

#ifndef _DATA_H
#define _DATA_H
    typedef struct
    {
        int y;
        int x;
    }POS;

    typedef struct{
        int ord;
        POS seat;
        int di;
    }ElemType;
#endif

新建main.c

#include "Data.h"
#include "stack.h"
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

 int item[10][10]={
    {1,1,1,1,1,1,1,1,1,1},
    {1,0,0,1,0,0,0,1,0,1},
    {1,0,0,1,0,0,0,1,0,1},
    {1,0,0,0,0,1,1,0,0,1},
    {1,0,1,1,1,0,0,0,0,1},
    {1,0,0,0,1,0,0,0,0,1},
    {1,0,1,0,0,0,1,0,0,1},
    {1,0,1,1,1,0,1,1,0,1},
    {1,1,0,0,0,0,0,0,0,1},
    {1,1,1,1,1,1,1,1,1,1}
};

static const POS inPos={1,1},outPos={8,8};
int IsPass(POS CurP){
    return item[CurP.y][CurP.x]==0?1:0;
}

POS NextPos(POS CurP,int di){
    POS p=CurP;
    switch(di){
        case 0:
            p.x--;//向左
            break;
        case 1:
            p.y++;//向下
            break;
        case 2:
            p.x++;//向右
            break;
        case 3:
            p.y--;//向上
            break;
    }
    return p;
}

void PrintItem(POS CurP){
    int i,j;
    system("cls");

    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
            if(i==CurP.y && j==CurP.x){
                printf("@");
                continue;
            }

            if(item[i][j]==1){
                printf("*");

            }else{
                printf(" ");
            }
        }
        printf("\n");
    }
}

void main(){

    STACK* s=InitStack();
    ElemType e;
    int setp=1;
    POS CurPos=inPos;
    PrintItem(inPos);

    do{
        if(IsPass(CurPos)){
            e.ord=setp;
            e.di=0;
            e.seat=CurPos;
            Push(s,&e);//只有能通过才压栈

            item[CurPos.y][CurPos.x]=2;
            if(CurPos.y==outPos.y && CurPos.x==outPos.x){
                
                PrintItem(CurPos);
                printf("ok!\n");
                break;
            }

            PrintItem(CurPos);

            CurPos=NextPos(e.seat,0);
            setp++;
            getch();
        }else{

            Pop(s,&e);//如果不能通过就弹栈

            if(e.di==4 && !IsEmpty(s)){
                    item[CurPos.y][CurPos.x]=8;
                    Pop(s,&e);
            }

            if(e.di<3){
                e.di++;
                Push(s,&e);
                CurPos=NextPos(e.seat,e.di);
            }
        }
    }while(!IsEmpty(s));

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++插入排序算法实例

    C++插入排序算法实例

    这篇文章主要介绍了C++插入排序算法实例,本文先是讲解了什么插入排序,然后给出了C++代码实例,需要的朋友可以参考下
    2014-10-10
  • OpenCV3实现车牌识别(C++版)

    OpenCV3实现车牌识别(C++版)

    这篇文章主要为大家详细介绍了OpenCV3实现车牌识别功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++版本简易Flappy bird

    C++版本简易Flappy bird

    这篇文章主要介绍了C++版本简易Flappy bird的相关资料,需要的朋友可以参考下
    2015-03-03
  • Opencv获取身份证号码区域的示例代码

    Opencv获取身份证号码区域的示例代码

    这篇文章主要介绍了Opencv获取身份证号码区域的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • C语言商品销售系统源码分享

    C语言商品销售系统源码分享

    这篇文章主要为大家分享了C语言商品销售系统源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 基于Qt+opencv开发的视频播放器示例详解

    基于Qt+opencv开发的视频播放器示例详解

    这篇文章主要为大家介绍了基于Qt+opencv开发的视频播放器示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 老生常谈C/C++内存管理

    老生常谈C/C++内存管理

    下面小编就为大家带来一篇老生常谈C/C++内存管理。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • C语言实现三子棋游戏(初级版)

    C语言实现三子棋游戏(初级版)

    这篇文章主要为大家详细介绍了C语言实现三子棋游戏初级版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • C++ 中的Lambda表达式写法

    C++ 中的Lambda表达式写法

    在 C++ 11 中,lambda 表达式(通常称为 “lambda”)是一种在被调用的位置或作为参数传递给函数的位置定义匿名函数对象的简便方法,下面通过本文给大家介绍C++ 中的Lambda表达式写法,需要的朋友参考下吧
    2017-02-02
  • C语言实现简单的停车场管理系统

    C语言实现简单的停车场管理系统

    这篇文章主要为大家详细介绍了C语言实现简单的停车场管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论