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));

}

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

(0)

相关推荐

  • C语言数据结构之迷宫求解问题

    现在网上各种对于迷宫的求解,版本多的数不胜数.本人小白一枚,贴上自己对迷宫的求解这个小项目,自己写的.望能帮助一些同样有困难的人,毕竟我当时费解了好一会儿时间呢. 首先,先标明对于迷宫求解这个项目,首先我提出自己的思路,利用"穷举求解"的方法(严蔚敏老师数据结构一书中提到,一开始不知方法其名.)其实简单来说就是一条路一条路去试,当然不能随便试,我的方法是按照从入口出发,顺一个方向向前探索,走得通就继续向前走:否则留下标记沿原路退回并换一个方向继续探索,直到所有的路都走完为止.还是用栈的

  • C语言使用广度优先搜索算法解决迷宫问题(队列)

    本文实例讲述了C语言使用广度优先搜索算法解决迷宫问题.分享给大家供大家参考,具体如下: 变量 head 和 tail 是队头和队尾指针, head 总是指向队头, tail 总是指向队尾的下一个元素.每个点的 predecessor 成员也是一个指针,指向它的前趋在 queue 数组中的位置.如下图所示: 广度优先是一种步步为营的策略,每次都从各个方向探索一步,将前线推进一步,图中的虚线就表示这个前线,队列中的元素总是由前线的点组成的,可见正是队列先进先出的性质使这个算法具有了广度优先的特点.广

  • 基于C语言实现简单的走迷宫游戏

    本文实例讲述了C语言实现简单的走迷宫游戏的方法,代码完整,便于读者理解. 学数据结构时用"栈"写的一个走迷宫程序,实际上用到双向队列,方便在运行完毕后输出经过的点. #include <cstdio> #include <deque> #include <windows.h> using namespace std; class node { public: int x,y; int lastOpt; }; deque<node> sta

  • C语言使用深度优先搜索算法解决迷宫问题(堆栈)

    本文实例讲述了C语言使用深度优先搜索算法解决迷宫问题.分享给大家供大家参考,具体如下: 深度优先搜索 伪代码 (Pseudocode)如下: 将起点标记为已走过并压栈; while (栈非空) { 从栈顶弹出一个点p; if (p这个点是终点) break; 否则沿右.下.左.上四个方向探索相邻的点 if (和p相邻的点有路可走,并且还没走过) 将相邻的点标记为已走过并压栈,它的前趋就是p点; } if (p点是终点) { 打印p点的坐标; while (p点有前趋) { p点 = p点的前趋;

  • 基于C语言实现的迷宫算法示例

    本文实例讲述了基于C语言实现的迷宫算法.分享给大家供大家参考,具体如下: 利用c语言实现迷宫算法,环境是vc++6.0. #include<stdio.h> #include<time.h> #include<cstdlib> int visit(int,int); void setmaze(); int maze[11][11]= { {0,0,2,2,2,2,2,2,2,2}, {2,0,2,2,0,2,0,2,0,2}, {2,0,2,0,0,0,0,0,0,2}

  • 基于C语言实现的迷宫游戏代码

    本文实例讲述了基于C语言实现迷宫游戏的方法,代码备有较为详尽的注释,便于读者理解.通过该游戏代码可以很好的复习C语言的递归算法与流程控制等知识,相信对于学习游戏开发的朋友有一定的借鉴价值. 完整的实例代码如下: #include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <dos.h> #define N 20/*迷宫的大小,可改

  • C语言数据结构之迷宫问题

    本文实例为大家分享了数据结构c语言版迷宫问题栈实现的具体代码,供大家参考,具体内容如下 程序主要参考自严蔚敏老师的数据结构c语言版,在书中程序的大体框架下进行了完善.关于迷宫问题的思路可查阅原书. #include<iostream> using namespace std; #define MAXSIZE 10 typedef int Status; typedef struct{ int x; int y; }Postype; typedef struct{ int ord; Postyp

  • C语言 数据结构中求解迷宫问题实现方法

    C语言 数据结构中求解迷宫问题实现方法 在学习数据结构栈的这一节遇到了求迷宫这个问题,拿来分享一下~ 首先求迷宫问题通常用的是"穷举求解" 即从入口出发,顺某一方向试探,若能走通,则继续往前走,否则原路返回,换另一个方向继续试探,直至走出去. 我们可以先建立一个8*8的迷宫其中最外侧为1的是墙 int mg[M+2][N+2]={ {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,

  • C语言实现数据结构迷宫实验

    本文实例为大家分享了C语言实现简单的数据结构迷宫实验,供大家参考,具体内容如下 分析:迷宫实验主要有两部分操作,其一是对迷宫的生成,其二是寻路使用栈的操作. 步骤: 一..h文件 1.首先是迷宫的生成,可以使用随机数种子生成,但主要逻辑部分并不在此,所以在这里直接写死,固定下来. 定义一个坐标类型的结构体,和二维数组迷宫: typedef struct { int x; int y; }Pos; //迷宫类型 typedef struct { int square[10][10] = { {1,

  • C语言实现走迷宫

    本文实例为大家分享了C语言实现走迷宫的具体代码,供大家参考,具体内容如下 描述 给一张个迷宫,问能否从起点走到终点,只能往上下左右走,不能斜着走 输入 多组测试数据,每组第一行两个正整数,分别为n和m 表示n这个迷宫有n行m列(0<n,m<10) 接着是n行m列, '#'表示路 '*'表示墙 'S'表示起点 'T'表示终点 输出 每组测试数据输出一个结果,如果能从S走到T,输出"YES",否则输出"NO" 输入样例: 2 2 S* #T 3 3 S*#

随机推荐