c语言非递归实现迷宫

 此题可以使用栈来避开递归,首先需要开辟一个和迷宫具有同样几何形状的结构体二维数组来保存是从哪一个点(坐标)到达该点的(该初始化时将所有的坐标都置为0),还需要一个可以保存坐标的栈。每次将能够走通的点(值为1)都入栈然后在循环的开始处将栈顶元素弹出保存进temp变量(保存坐标的变量)中,访问temp变量四周的元素是否可以被访问,如果可以被访问(值为0)则将对应路径数组中的元素(即对应坐标)值改为temp变量的值并将该能被访问的变量入栈,再将迷宫中的0(能访问)更改为2(已被访问过)防止重复访问。最后从路径数组中的出口处开始倒序输出所走路径即可。

  在此种思想中栈保存了所有可以走通的点,当一个点的四周都不能够走通时弹出的该点坐标程序并没有进行任何实质性的处理,所以这就相当于一个“回溯”的过程。而访问四周的点的过程就是一个枚举的过程。

stack.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include <assert.h>
typedef struct Pos
{
    int _col;
    int _row;
}Pos;
typedef int Datatype;
typedef struct Stack
{
    Pos *_mz;
    size_t _size;
    size_t _capacity;
}Stack;

void StackInit(Stack** ps, size_t capacity)
{
    assert(*ps);
    (*ps)->_size = 0;
    (*ps)->_capacity = capacity;
    (*ps)->_mz = (Pos *)malloc(sizeof(Pos)*(*ps)->_capacity);
    return;
}
Pos StackTop(Stack *s)
{
    return s->_mz[s->_size - 1];
}
void StackPush(Stack **pps, Pos *x)
{
    assert(pps);
    assert(*pps);
    if ((*pps)->_size == (*pps)->_capacity)
    {
        (*pps)->_capacity *= 2;
        (*pps)->_mz = (Pos*)realloc((*pps)->_mz, (sizeof(Pos))*(*pps)->_capacity);
    }
    assert(*pps);
    ((*pps)->_mz[(*pps)->_size])._col = x->_col;
    ((*pps)->_mz[(*pps)->_size])._row = x->_row;
    (*pps)->_size++;
}
Pos *StackPop(Stack *ps)
{
    return ps->_mz + (--ps->_size);
}
int StackEmpty(Stack *ps)
{
    assert(ps);
    return ps->_size;
}
void StackPrint(Stack *ps)
{
    int i = 0;
    for (i = ps->_size - 1; i >= 0; i--)
        printf("(%d,%d)->", ps->_mz[i]._col + 1, ps->_mz[i]._row + 1);
    printf("\n");
}

test.c

#include"m
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值