迷宫问题(简单模拟)

本文通过Java、C和C++三种语言实现了一个8行7列迷宫的递归求解算法。作者通过比喻深入浅出地解释了递归的工作原理,类比于括号配对,强调了递归过程中方法调用的依赖关系。在模拟过程中,创建了挡板以改变路径,并展示了迷宫的初始状态及求解后的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了复习递归,而模拟学习的。所以迷宫不大,总体是8行7列。

图解

1

A为起点,B为终点。

1
如下图在A和B之间设置挡板被隔绝之后,结果如下。
1

1

体会领悟:

我做这个模拟之后对递归的理解就是像这个{{{}}}的字符串,只有最中间的括号配对成功了,同时发送一个成功的信号给第二括号,他才能开始配对,就像第一个本方法调用第二个本方法,但是第一个本方法还只执行一半没有执行完,他要等第二个本方法将结果返回给他,他才能完成自己的工作。而第二个本方法又依赖于第三个本方法返回的结果,直到规定的边界条件被触发,结果一层一层地返回。
PS:是不是有套娃的既视感。

代码实现(Java):

package demo;

public class MiGong {
	public static void main(String[] args) {
	//为0,表示没走过;为1,表示挡板或墙;为2,表示走过,可以走通;为3表示死路,走不通
		//构建迷宫上下围墙
		int[][] array = new int[8][7];
		for(int i = 0;i < 7;i++) {
			array[0][i] = 1;
			array[7][i] = 1;
		}
		//设置挡板,此处可自行变换,来模拟出不同的路径
		array[3][0] = 1;array[3][1] = 1;
		for(int i = 0;i < 8;i++) {
			array[i][0] = 1;
			array[i][6] = 1;
		}
		//设置迷宫的左右围墙
		for(int i = 0;i < 8;i++) {
			for(int j = 0;j < 7;j++) {
				System.out.print(array[i][j]+"  ");
			}
			System.out.println();
		}
		
		findWay(array,1,1);
		
		System.out.println("----------------------");
		for(int i = 0;i < 8;i++) {
			for(int j = 0;j < 7;j++) {
				System.out.print(array[i][j]+"  ");
			}
			System.out.println();
		}
	}
	public static boolean findWay(int[][] array,int i,int j) {
		if(array[6][5] == 2) {//当此处为2,表示已经走到目的地了
			return true;
		}else {
			if(array[i][j] == 0) {
				array[i][j] = 2;//假设可以走,下面采用下右上左的寻找策略(寻找策略跟起点和终点的方位有关)
				if(findWay(array,i+1,j)) {
					return true;
				}else if(findWay(array,i,j+1)) {
					return true;
				}else if(findWay(array,i-1,j)) {
					return true;
				}else if(findWay(array,i,j-1)) {
					return true;
				}else {//此点下右上左都不行,则为死路,为3
					array[i][j] = 3;
					return false;
				}
			}else {//为1,表示挡板或墙不能走;为2,已经走过没有意义;为3,死路走不通的
				return false;
			}
		}
	}
}



C语言版

工具为codeblocks

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
bool findWay(int array[][7],int i,int j){
    if(array[6][5] == 2){
        return true;
    }else{
        if(array[i][j] == 0){
            array[i][j] = 2;
            if(findWay(array,i+1,j)){
                return true;
            }else if(findWay(array,i,j+1)){
                return true;
            }else if(findWay(array,i-1,j)){
                return true;
            }else if(findWay(array,i,j-1)){
                return true;
            }else{
                array[i][j] = 3;
                return false;
            }
        }else{
            return false;
        }
    }
}

int main()
{
    int map[8][7];
    int i,j;
    for(i =0;i < 8;i++){
        for(j = 0;j < 7;j++){
            map[i][j] = 0;
        }
    }
    for(i = 0;i < 7;i++){
        map[0][i] = 1;
        map[7][i] = 1;
    }
    for(i = 0;i < 8;i++){
        map[i][0] = 1;
        map[i][6] = 1;
    }
    map[3][0] = 1;map[3][1] = 1;
    for(i =0;i < 8;i++){
        for(j = 0;j < 7;j++){
            printf("%2d",map[i][j]);
        }
        printf("\n");
    }

    findWay(map,1,1);

    printf("---------------------\n");
    for(i =0;i < 8;i++){
        for(j = 0;j < 7;j++){
            printf("%2d",map[i][j]);
        }
        printf("\n");
    }
    return 0;
}

1

C++版

#include <iostream>
#include <vector>
using namespace std;
bool findWay(int (*array)[7],int i,int j);
bool findWay(int (*array)[7],int i,int j){
    if(array[6][5] == 2){
        return true;
    }else{
        if(array[i][j] == 0){
            array[i][j] = 2;
            if(findWay(array,i+1,j)){
                return true;
            }else if(findWay(array,i,j+1)){
                return true;
            }else if(findWay(array,i-1,j)){
                return true;
            }else if(findWay(array,i,j-1)){
                return true;
            }else{
                array[i][j] = 3;
                return false;
            }
        }else{
            return false;
        }
    }
}
int main()
{
    int map[8][7];
    int i,j;
    for(i =0;i < 8;i++){
        for(j = 0;j < 7;j++){
            map[i][j] = 0;
        }
    }
    for(i = 0;i < 7;i++){
        map[0][i] = 1;
        map[7][i] = 1;
    }
    for(i = 0;i < 8;i++){
        map[i][0] = 1;
        map[i][6] = 1;
    }
    map[3][0] = 1;map[3][1] = 1;
    for(i =0;i < 8;i++){
        for(j = 0;j < 7;j++){
            cout<<map[i][j]<<" ";
        }
        cout<<"\n"<<endl;
    }

    findWay(map,1,1);

    printf("---------------------\n");
    for(i =0;i < 8;i++){
        for(j = 0;j < 7;j++){
             cout<<map[i][j]<<" ";
        }
        cout<<"\n"<<endl;
    }
    return 0;
}

1

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值