C语言学习日记(15)——回溯法解迷宫非递归版

本文介绍了如何使用非递归的方式实现回溯法解决迷宫问题。通过一个int数组choose来模拟递归调用栈,用数组元素的值表示路径选择,并用一个int top作为栈顶指针,记录当前进度。在回退时,数组和top的调整确保了回溯的正确性。这种非递归实现为解决迷宫问题提供了另一种思路。
摘要由CSDN通过智能技术生成

用递归来实现回溯应该是很常见的一种思路。因为回溯法最核心的问题就是如何保存每一步已经选择过的方案信息,以供回退时继续选择下一个方案。而使用递归函数恰好利用了函数调用栈保存了每一步的“进度”,使得每一次函数返回时上一级函数可以继续这个“进度”。

虽然递归实现起来简单易理解,但使用递归并不是唯一的选择,而且,使用递归总给人一种效率可能不高的感觉。通过简单改造,我们也可以使用非递归的方法来实现回溯法。具体思路是:

为了保存每一步的“进度”,可以这样做,用一个int choose[25]数组来充当一个栈,数组每个元素可以从0取到3,分别代表上下左右。当进行到某一步时,按上下左右的顺序进行试探,对应的数组元素就从0开始变大,假设可以向下走一步,此时数组元素的值就变为了1,这样就保存了这一步的“进度”信息,当发生回退时,可以继续从2开始,即从左边继续试探。还要用一个int top来充当栈顶指针,当前进一步top就加1,回退一步top就减1。具体实现代码如下:

#include<stdio.h>
//定义上下左右方向
int direction[4][2] = {-1,0,1,0,0,-1,0,1}; 
int puzzle[5][5] = {
    1,1,1,1,1,
    0,0,1,0,1,
    1,0,0,0,1,
    1,0,0,0,0,
    1,1,1,1,1
};
int path[25][2] = {0};  //用于记录路径
int choose[25] = {0};  //记录每一步已经选择到了哪个方向,0-3分别表示表示上下左右,全部初始为0
int top = 0;   //栈顶指针,总是指向最后一个元素
void getpath(i
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值