找到穿过迷宫的所有可能路径

2023-11-22

我正在尝试创建一个程序,该程序将遍历一个随机生成的迷宫,其中 1 是开放的,0 是墙壁。从左上角开始,到右下角结束。路径可以向上、向下、向左、向右。

目前,我的程序为我提供了一种解决方案,但我无法让它打印多个路径。

我已经阅读了这个问题的几个不同版本,但我无法找到一个与我的参数完全匹配的版本。

这是我的代码,我省略了随机生成迷宫的部分。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>

int  n, minMatrix, solIndex = 1, minLen = 10000000; //I use the latter 3 variables in order to find the shortest path, not relevant for now


bool solveMaze(int mat[n][n],int x, int y, int sol[][n], int count){

int i, j;
  if((!(x >= 0 && x <n  && y >=0 && y < n)) || mat[x][y] == 0 || sol[x][y] == 1){
    return false;
  }

  if(x == n-1 && y == n-1){
    sol[x][y] = 1;

    printf("Solution %d is:\n", solIndex);
    for(i = 0; i < n; i++)
    {
      for( j=0;j<n;j++)
      {
        printf("%d", sol[i][j]);
      }
      printf("\n");
    }

    if(count<minLen)
    {
      minLen = count;
      minMatrix = solIndex;
    }
    solIndex +=1;
    sol[x][y] = 0;
    return true;
  }

  sol[x][y] = 1;

  if(solveMaze(mat, x+1, y, sol, count+1)){
    return true;
  }

  if(solveMaze(mat, x-1, y, sol, count+1)){
    return true;
  }

  if(solveMaze(mat, x, y+1, sol, count+1)){
    return true;
  }

  if(solveMaze(mat, x, y-1, sol, count+1)){
    return true;
  }
  sol[x][y] = 0;
  return false;

}

我省略了随机生成迷宫的主要部分。

int main(){

if(!solveMaze(**mat, 0, 0, sol, 0)){
    printf("No possible paths, run program again\n");
  }
  else{
    printf("the shortest path is %d\n", minMatrix);
  }
}

例如,如果我有迷宫

1100111111
1101111111
1111110110
1110011111
1101101011
1111101011
1110111101
1100111111
1110111011
1101101111

它给了我它找到的第一条路径

1000000000
1001100000
1111110000
1100011000
1100001000
1100001000
1100001000
1100001011
1100001011
1100001111

虽然需要绕一圈,但由于人们习惯按照下、上、右、左的顺序走,但仍然是一条路。

所以最终,我不确定如何迭代多个路径。


使用来自此类似问题的示例迷宫的直接完整工作解决方案(被标记为重复但可以独立编译):使用 DFS 查找迷宫中的所有路径

它使用带有简单递归的简单 DFS,这似乎与此处问题中的方法相同。它在单个字符串实例中跟踪当前轨道,并就地修改迷宫以阻止当前轨道。

#include <iostream>
#include <string>

const int WIDTH = 6;
const int HEIGHT = 5;

void check(int x, int y, int dest_x, int dest_y, 
           int (&maze)[HEIGHT][WIDTH], std::string& path) {
  if (x < 0 || y < 0 || x >= WIDTH|| y >= HEIGHT || !maze[y][x]) {
    return;        
  }
  int len = path.size();
  path += (char) ('0' + x);
  path += ',';
  path += (char) ('0' + y);

  if (x == dest_x && y == dest_y) {
    std::cout << path << "\n";
  } else {
    path += " > ";
    maze[y][x] = 0;  
    check (x + 0, y - 1, dest_x, dest_y, maze, path);
    check (x + 0, y + 1, dest_x, dest_y, maze, path);
    check (x - 1, y + 0, dest_x, dest_y, maze, path);
    check (x + 1, y + 0, dest_x, dest_y, maze, path);
    maze[y][x] = 1;
  }

  path.resize(len);
}


int main() {
  int maze[HEIGHT][WIDTH] = {
      {1,0,1,1,1,1},
      {1,0,1,0,1,1},
      {1,1,1,0,1,1},
      {0,0,0,0,1,0},
      {1,1,1,0,1,1}};

  std::string path;
  check(0, 0, 4, 3, maze, path);
  return 0;
}

可运行版本:https://code.sololearn.com/cYn18c5p7609

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

找到穿过迷宫的所有可能路径 的相关文章

  • 洛谷 P1825 [USACO11OPEN]Corn Maze S(bfs)

    题目传送 1 这仅仅是一道加了传送门的bfs 2 仅仅加了一个传送门 xff0c 就卡了我一下午 3 门存在不成对的情况 span class token macro property span class token directive
  • P1825 [USACO11OPEN]Corn Maze S 题解

    这道题就是一道普通的搜索题 xff0c 非常非常普通 xff0c 普通的不能再普通那种 xff0c 和以前的bfs一样 xff0c 不过这个bfs要注意一个特判 xff0c 当弹出的那个元素的是大写字母的时候 xff0c 要窜梭到对应的大写
  • P1825 [USACO11OPEN]Corn Maze S——bfs

    USACO11OPEN Corn Maze S 题面翻译 奶牛们去一个 N M N times M N M 玉米迷宫 xff0c 2
  • P1825 [USACO11OPEN]Corn Maze S 【BFS】

    题目描述 This past fall Farmer John took the cows to visit a corn maze But this wasn t just any corn maze it featured severa
  • 编程理论:解决迷宫

    解决迷宫问题有哪些可能的方法 我有两个想法 但我认为它们不是很优雅 基地情况 我们有一个矩阵 这个矩阵中的元素以一种代表迷宫的方式排序 有一个入口 一个出口 我的第一个想法是派一个机器人穿过迷宫 跟随一侧 直到走出迷宫 我认为这是一个非常缓
  • 找到穿过迷宫的所有可能路径

    我正在尝试创建一个程序 该程序将遍历一个随机生成的迷宫 其中 1 是开放的 0 是墙壁 从左上角开始 到右下角结束 路径可以向上 向下 向左 向右 目前 我的程序为我提供了一种解决方案 但我无法让它打印多个路径 我已经阅读了这个问题的几个不
  • 表示并解决给定图像的迷宫

    给定图像表示和解决迷宫的最佳方法是什么 给定一张 JPEG 图像 如上所示 读取它 将其解析为某种数据结构并解决迷宫的最佳方法是什么 我的第一直觉是逐像素读取图像并将其存储在布尔值列表 数组 中 True对于白色像素 以及False对于非白
  • 生成迷宫的好算法是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 假设你想要一个 N M 网格上的简单迷宫 有一条路径通过 并且有很多死胡同 但这看起来 正确 即就像有人手工制作的 没有太多微小的死胡同和所有这些
  • C++中迷宫的DFS最短路径

    我无法弄清楚如何准确地使其发挥作用 我正在尝试使用 DFS 获得到达目标的最短路径 我知道 BFS 更好 但有人要求我使用 DFS 正如您所看到的 我尝试对导致最终的所有堆栈进行比较以找到目标 但它不起作用 只有导致目标的第一个堆栈被打印
  • 如何使用列表在 python 上制作一个简单的 3x3 迷宫?

    我有这个项目 其中我必须制作一个基本的基于文 本的迷宫 冒险游戏 到目前为止 这是我的代码 但很奇怪 我希望它能够随时退出 并在输入不在选项中时显示 请选择可用方向 我知道我的代码是错误的 但我不知道该怎么办 有人可以帮我吗 谢谢 顺便说一
  • 简单的 Java 2d 数组迷宫示例

    我正在工作或了解如何创建一个简单的java 二维迷宫应该是这样的 int maze 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 1 1 1 0 1
  • 如何使用opencv python解决theta迷宫?

    I have to find shortest path from the center of the maze to the outermost circle I have to solve this problem using open
  • 如何打印迷宫中从源到目标的 BFS 路径

    我正在尝试实现 BFS 以便找到迷宫中从源到目标的最短路径 我遇到的问题是我无法打印路径 它在迷宫中打印为 但是如何从 BFS 的前辈中提取路径而不打印所有访问过的节点 这是我的代码供您编译 include
  • Java 递归暴力迷宫求解器

    在尝试编写一个强力解决迷宫的 C 程序时 我首先编写了这个 java 程序来测试一个想法 我对 C 很陌生 打算在 Java 中正确使用它后将其转换 因此 我尝试远离数组列表 花哨的库等 以便更容易转换为 C 该程序需要生成最短步骤的单宽度
  • 使用堆栈来遍历和解决迷宫 - Java

    所以我正在尝试创建一个迷宫求解器程序来解决 X 和 O 的迷宫 我想做的是创建一个点类 这样我就可以创建一个二维点数组 这将允许打印到输出页面以及相对简单地实现堆栈 我想在实际程序本身中实现的一般思想的最简单算法我认为应该是 1 Move
  • 3D 迷宫中的最短路径

    我正在尝试编写一个程序来使用递归查找 3D 迷宫中的最短路径 我能够编写找到穿过迷宫的随机路径的代码 但我想知道如何修改我的代码以找到最短路径 请注意 我想保留递归方法 有人可以提出解决方案吗 这是一个二维迷宫示例 s XXXX XX X
  • 将简单的单色绘图图像转换为二维文本数组

    我正在尝试开发一种算法 将简单的单线图像 即迷宫 转换为文本二维数组 例如 下面的图像 它将被转换为以下文本数组
  • python中不规则点之间的坐标列表

    想象一下 我们为 x 和 y 随机选择两个介于 0 到 100 之间的点 例如 95 7 35 6 现在使用简单的 pygame draw line 函数 我们可以轻松地在这些点之间绘制一条没有任何间隙的线 我的问题是 我们如何找到两点之间
  • 用 Java 创建迷宫求解算法

    我被分配了用 Java 创建迷宫求解器的任务 这是任务 Write an application that finds a path through a maze The maze should be read from a file A
  • 如何检查是否存在可能的路径?

    我正在开发一个基于 javascript 的实验性游戏 玩家必须在二维平铺地图上移动才能退出 请随意检查这个小提琴并演奏 http jsfiddle net moonlife 74vLd 我只是随机放置障碍物 但有时障碍物会挡住玩家和出口之

随机推荐

  • 分布式作业调度、管理和报告

    我最近玩了Hadoop它对 MapReduce 作业的调度 管理和报告印象深刻 它似乎使新作业的分配和执行变得非常无缝 使开发人员能够专注于其作业的实施 我想知道Java领域中是否存在一些对于作业的分布式执行来说不容易表达为MapReduc
  • RandomNumber 方法每次调用都返回相同的数字

    每次从 for 循环中调用 RandomNumber 方法时 我都尝试生成不同的随机数 现在 它每次都返回相同的数字 这是我的 RandomNumber 方法 private int RandomNumber int min int max
  • 我如何模拟 java.time.LocalDate.now()

    在我的测试用例中 我需要测试时间敏感的方法 在该方法中我们使用 java 8 类 LocalDate 它是not Joda 当我运行测试时 我可以做什么来改变时间 在您的代码中 替换LocalDate now with LocalDate
  • 语音合成 API 在说出单词时突出显示单词

    目前 我正在制作一个简单的应用程序 其中使用语音合成 API 说出文本 我想突出显示正在说出的单词 粗体 我目前有一个非常基本的实现 使用 onboundary 事件来执行此操作 然而 我想知道是否有更好 更好的方法来做到这一点 因为我的实
  • 为什么这个图像在Java中按比例缩小后看起来这么糟糕?

    这是原始图像 http rank my public images uploaded orig 4193395691714613396 png 这里它被缩小到 300x225 http rank my public images uploa
  • 在 .NET/C# 中使用委托加速反射 API

    This post有评论if you need to call the method multiple times use reflection once to find it then assign it to a delegate an
  • URIBuilder 和列表查询参数

    我正在使用阿帕奇URI生成器构建一个查询字符串获取方法的休息服务 RequestMapping value remote public Return getTest Ordine ordine throws Exception 这是输入对象
  • Java重构工具[重复]

    这个问题在这里已经有答案了 可能的重复 像 ReSharper 这样的工具 但适用于 Java 我非常频繁地使用 Eclipse 提供的 Java 代码重构工具 提取接口 重命名方法等 有谁知道其他类似的工具 最好是 Eclipse 插件
  • 在实体框架中添加与同一个表的第二个一对一关系

    我正在做代码优先的实体框架设计 我有一个表 Account 它有一个属性 Supervisor public class Account public int Id get set public Account Supervisor get
  • 如何进入亚音速?

    一个月前 我搜索了一些可以为我的 SQL 数据库 表生成 C 类的工具 这样我就不必手动编写DAL类并节省大量时间 我遇到了 ORM 和亚音速 我在主页上观看了网络广播http subsonicproject com 并且是印象深刻 by
  • 在静默模式下运行 CMD 或 BAT

    如何以静默模式运行 CMD 或 bat 文件 我希望阻止向用户显示 CMD 界面 包括这句话 echo off 就在你的bat脚本的顶部
  • 如何在 Windows 8 应用程序中向 HttpWebRequest 添加标头?

    我开发 C XAML Metro ui 应用程序 我想调用一些服务并使用HttpWebRequest为了这 之前的实现HttpWebRequest包含ContentLength and UserAgent特性 但WinRT的实现却没有它 我
  • AES/CBC 真的需要 IV 参数吗?

    我正在编写一个简单的应用程序来使用 AES CBC 模式 加密我的消息 据我了解 CBC 模式需要 IV 参数 但我不知道为什么我的代码在不使用 IV 参数的情况下工作 任何人都可以解释为什么吗 谢谢 加密消息无一例外地打印 T9KdWxV
  • 释放-获取的传递性

    正当我以为我已经掌握了原子知识时 我看到了另一篇文章 这是摘录自GCC wiki under 总体总结 Thread 1 Thread 2 Thread 3 y store 20 if x load 10 if y load 10 x st
  • node.js,捕获错误以便脚本不会中断?

    我有一个 node js 脚本 每当发生错误时 node js 都会因发生的错误而停止运行 检查 Node js 中的错误的正确方法是什么 这样它就不会破坏脚本并导致 Node js 停止 您可以通过设置以下内容来捕获其他未捕获的错误 pr
  • 数据包加密在Chef服务器上加密,但是如何加密本地副本呢?

    我在私有 git 存储库中拥有完整的 Chef 配置集 包括角色 食谱 数据包等 我发现当数据包上传到 Chef 服务器时 我可以使用 secret file 选项对其进行加密 但我也想将这些数据包加密存储在 git 存储库中 唯一想到的就
  • Django 开发服务器和 MIME 类型

    是否有在 django 开发服务器中设置 MIME 类型 具体来说 我希望从 Chrome 开发工具的警告中删除此消息 Resource interpreted as Image but transferred with MIME type
  • % 在 like 子句的开头

    我听说由于性能原因 不建议在 SQL Server 中的 LIKE 子句开头使用 为什么会这样呢 有关此问题的更多详细信息将帮助我了解此问题的影响 A 在一个的开始LIKE子句意味着索引完全没有用 如果有静态文本将图案锚定在 至少可以从索引
  • 在批处理文件中,如何判断进程是否正在运行?

    我想编写一个批处理文件来检查进程是否正在运行 如果正在运行 则执行一个操作 如果没有 则执行另一个操作 我知道我可以使用任务列表列出所有正在运行的进程 但是有没有更简单的方法来直接检查特定进程 看起来这应该可行 但事实并非如此 taskli
  • 找到穿过迷宫的所有可能路径

    我正在尝试创建一个程序 该程序将遍历一个随机生成的迷宫 其中 1 是开放的 0 是墙壁 从左上角开始 到右下角结束 路径可以向上 向下 向左 向右 目前 我的程序为我提供了一种解决方案 但我无法让它打印多个路径 我已经阅读了这个问题的几个不