油管视频《编程思维》中的题目,使用C语言编写出来,第十集,世界上的机器

题目:假设首先我拥有大量的机器人,从迷宫中心的水晶出发,其次我拥有取之不尽的线轴,这些线非常结实耐用,可以在必要时刻切断线,现在面对一个迷宫,迷宫以水晶为中心,哪里有许多条死胡同,但没有一条会绕回到起点,我只有一次机会,可以在机器人们跳入迷宫,寻找出口前,发送一条简单的指令,请问什么指令能让机器人快速穿过迷宫,打开门,并引领出一条通往水晶的道路,可以让机器人们带着线轴不断尝试,每走过哪里留下线,线也是可以切断的,请按照问题给出指令。

涉及的编程原理

1,递归:程序使用递归来探索迷宫的所有可能路径,直到找到出口。

2,回溯:如果某条路径走不通,程序会回溯到上一步并尝试其他路径。

3,二维数组:使用二维数组表示迷宫和路径。

4,条件判断:判断当前位置是否可以走。

5,路径标记:在路径上留下标记,以便记录已经走过的路。

该问题考察的是递归回溯算法的应用。我们可以用一个简单的深度优先搜索(DFS)来解决这个迷宫问题。机器人从水晶出发,沿着路径走,并在走过的路径上留下线。当机器人走到死胡同时,可以回溯并尝试其他路径。

程序编写

#include<stdio.h>

#include<stdbool.h>// 引入标准输入输出库和布尔类型库,以便使用 printf 和 bool 类型

#define N 5 //假设迷宫是5成5,定义一个宏 --->宏是指,预处理器进行文本替换的机制,特点1,编译前文本替换,2无类型,3容易修改,提高可维护性,4参数宏

int maze[N][N] = {
    {1, 0, 0, 0, 0},
    {1, 1, 0, 1, 1},
    {0, 1, 0, 0, 1},
    {0, 1, 1, 1, 1},
    {0, 0, 0, 0, 1}
};//定义一个二维数组 maze,表示迷宫结构,其中 1 表示通路,0 表示墙

int path[N][N] ={0};//定义一个二维数组 path,用于记录走过的路径,初始化为 0。

bool issafe(int x, int y){

        return(x>=0&&x<N&&y>=0&&y<N&&maze[x][y]=1);

}//定义一个函数 isSafe,判断坐标 (x, y) 是否在迷宫范围内且是通路。\

bool soveMazeUtil(int x,int y){//定义一个递归函数 solveMazeUtil,用于尝试从 (x, y) 位置寻找出口

        if (x == N - 1 && y == N - 1) {
        path[x][y] = 1;
        return true;
    }//如果当前坐标是出口 (N-1, N-1),标记路径并返回 true,表示找到了解决方案。

            if (isSafe(x, y)) {
                path[x][y] = 1;//如果当前位置安全(即可以走),在 path 中标记为 1。

                 if (solveMazeUtil(x + 1, y))
                  return true;//尝试向右移动。如果递归调用返回 true,则返回 true,表示找到了解决方案。

                  if (solveMazeUtil(x, y + 1))
                   return true;//尝试向下移动。如果递归调用返回 true,则返回 true

                   path[x][y] = 0;//如果向右和向下都无法走通,回溯,将当前位置标记为未走过(0)。

    }

                 return false;// 如果当前位置无法走通,返回 false

}

        bool solveMaze() {
            if (!solveMazeUtil(0, 0)) {
                printf("没有解决方案\n");
                return false;
    }//定义函数 solveMaze,从起点 (0, 0) 开始尝试解决迷宫。如果 solveMazeUtil 返回 false,打印 "没有解决方案"。

 for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("%d ", path[i][j]);
        }
        printf("\n");
    }
    return true;
}//如果找到了解决方案,打印路径。

int main() {
    solveMaze();
    return 0;
}//主函数调用 solveMaze,开始解决迷宫问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值