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++数组模拟之单链表与双链表和栈和队列的实现过程,了解内部原理是为了帮助我们做扩展,同时也是验证了一个人的学习能力,如果你想让自己的职业道路更上一层楼,这些底层的东西你是必须要会的,跟随下文来具体了解吧
    2023-02-02
  • Qt跨平台窗口选择功能的实现过程

    Qt跨平台窗口选择功能的实现过程

    很多时候为了方便软件的使用,我们需要让编写的界面程序显示在最上层,这时候就需要对窗口属性进行调整,下面这篇文章主要给大家介绍了关于Qt跨平台窗口选择功能的实现过程,需要的朋友可以参考下
    2022-12-12
  • OpenCV图像文件批量读取编程实例

    OpenCV图像文件批量读取编程实例

    这篇文章主要为大家详细介绍了OpenCV图像文件批量读取编程实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C++ 数据结构超详细讲解顺序表

    C++ 数据结构超详细讲解顺序表

    程序中经常需要将一组数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化,顺序表则是将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示
    2022-03-03
  • C语言实现弹跳小球

    C语言实现弹跳小球

    这篇文章主要为大家详细介绍了C语言实现弹跳小球,设置了小球分数及过关难度,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C语言 sprintf 函数详情

    C语言 sprintf 函数详情

    这篇文章主要介绍了C语言 sprintf 函数,文章主要包括sprintf 函数简介、sprintf 函数使用和简单说明了一下sprintf、fprintf、printf 函数区别,需要的朋友可以参考一下文章的具体内容
    2021-10-10
  • c++实现堆排序的示例代码

    c++实现堆排序的示例代码

    本文主要介绍了c++实现堆排序的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • C++深入探索类和对象之封装及class与struct的区别

    C++深入探索类和对象之封装及class与struct的区别

    C++ 类与对象涉及的知识点非常广泛,所以我准备写成几个特定的部分来作为博文分享,这次的blog将详细讲解类的属性、行为、访问权限,class与struct的区别以及具体案例,希望能够对你们有帮助,解决入门小白或者对这方面了解不多的朋友们,那么接下来开始今天的内容
    2022-05-05
  • 详解C++编程中的条件判断语句if-else与switch的用法

    详解C++编程中的条件判断语句if-else与switch的用法

    这篇文章主要介绍了C++编程中的条件判断语句if-else与switch的用法,是C++入门学习中的基础知识,需要的朋友可以参考下
    2016-01-01
  • 深入理解c++常成员函数和常对象

    深入理解c++常成员函数和常对象

    下面小编就为大家带来一篇深入理解c++常成员函数和常对象。小编觉得挺不错的,现在分享给大家,也给大家做个参考,一起跟随小编过来看看吧
    2016-05-05

最新评论