- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
迷宫拼图中的老鼠 - 迷宫以 N*N block 的二进制矩阵形式给出,其中源 block 是最左上角的 block ,即迷宫 [0][0],目标 block 是最右下角的 block ,即迷宫 [N -1][N-1]。老鼠从源头出发,必须到达目的地。老鼠可以向任何方向移动:向前、向下、向左、向右。在迷宫矩阵中,0表示该 block 是死胡同,1表示该 block 可以在从源到目的地的路径中使用。
问题 - 找到所有可能的解决方案以及将老鼠带出迷宫的解决方案的数量。我能够为老鼠在迷宫中找到“单一解决方案”。但如何确定不同的可能解以及解的数量呢?粘贴下面的代码将确定一个解决方案并打印相同的结果。请帮助我如何确定不同的可能解决方案以及解决方案的数量。
#include<stdio.h>
#include<conio.h>
#define N 5 //Maze Size 5X5 matrix
//Function declarations
void maze(int m[N][N]);
int maze_soln(int soln[N][N], int m[N][N],int ,int,int path[N][N]);
int issafe(int m[N][N], int x, int y,int path[N][N]);
// This function checks for valid cell. If already visited in the past
// path[][] will take care of returning false.
int issafe(int m[N][N], int x, int y,int path[N][N])
{
if (x >= 0 && y >= 0 && x < N && y < N && m[x][y] == 1 && path[x][y] !=1)
return true; // Valid cell.
else
return false;
}
// Maze solutions. Checks for proper cell. finds proper path
// By going LEFT,RIGHT,UP or DOWN
int maze_soln(int soln[N][N], int m[N][N],int x,int y,int path[N][N])
{
//All the cells have been visited
if (x == N - 1 && y == N - 1)
{
soln[x][y] = 1; //mark the cell as possible path
return true;
}
// Find out different paths
if (issafe(m, x, y,path) == true)
{
soln[x][y] = 1; // mark the cell as possible solution
path[x][y] = 1; //mark the path as visited
// Go RIGHT and see if there's a path
if (maze_soln(soln, m, x, y + 1,path))
return true;
//LEFT
if (y> 0 && maze_soln(soln, m, x, y-1,path))
return true;
//DOWN
if (maze_soln(soln, m, x + 1, y,path))
return true;
//UP
if (x>0 && maze_soln(soln, m, x - 1, y,path))
return true;
soln[x][y] = 0;
return false;
}
return false;
}
// Prints the solution matrix if proper path is found
void maze(int m[N][N])
{
int i, j;
int soln[N][N] = { 0 };
int path[N][N] = { 0 };
if (maze_soln(soln, m, 0, 0,path) == true)
{
printf("\n Solution\n"); //Print solution matrix
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
printf("\t%d", soln[i][j]);
}
printf("\n");
}
}
return;
}
// Main function
int main()
{
int i, j;
//Maze matrix
int m[N][N] = { { 1,1,1,0,0 },
{ 1,1,0,1,0 },
{ 0,1,0,1,1 },
{ 1,1,1,1,1 },
{ 1,0,0,1,1 } };
//Print the Maze
printf("MAZE\n");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
printf("\t%d", m[i][j]);
}
printf("\n");
}
//Call maze function to find out the path
// and print the solution matrix
maze(m);
_getch();
}
最佳答案
当你找到第一个解决方案时,你会提前返回。如果你想看到更多的解决方案,你必须继续前进并探索所有路径。您的核心函数现在返回的是解决方案的数量,而不是真值。
当然,当您找到解决方案时,您必须将其存储起来,以便以后可以打印它们。这可能会占用大量内存,因为在稀疏迷宫中可能有许多可能的解决方案。您也不知道预先有多少种解决方案。
因此,一个简单的替代方案是在找到当前解决方案后打印它。
与您的问题无关,但您实际上并不需要三个单独的数组。当您添加另一个可能的值(访问空间)时,您可以使用原始的墙壁和空间数组。该值充当面包屑,告诉您已经去过哪里。有效的下一步只能是到达未访问过的空间。
将其付诸实践,您会得到,例如:
#include <stdio.h>
#define N 5
int issafe(int m[N][N], int x, int y)
{
if (x < 0 || x >= N) return 0;
if (y < 0 || y >= N) return 0;
return (m[x][y] == 1);
}
void print(int m[N][N])
{
static const char *glyph = "#.*";
static int nsol = 0;
int i, j;
printf("Solution %d\n\n", ++nsol);
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
putchar(glyph[m[i][j]]);
}
putchar('\n');
}
putchar('\n');
}
int maze(int m[N][N], int x, int y)
{
int nsol = 0;
if (issafe(m, x, y)) {
m[x][y] = 2;
if (x == N - 1 && y == N - 1) {
print(m);
nsol = 1;
} else {
nsol += maze(m, x, y + 1);
nsol += maze(m, x, y - 1);
nsol += maze(m, x + 1, y);
nsol += maze(m, x - 1, y);
}
m[x][y] = 1;
}
return nsol;
}
int main()
{
int m[N][N] = {
{ 1, 1, 1, 0, 0 },
{ 1, 1, 0, 1, 0 },
{ 0, 1, 0, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 0, 0, 1, 1 }
};
int nsol;
nsol = maze(m, 0, 0);
printf("%d solutions.\n", nsol);
return 0;
}
关于c - 老鼠迷宫谜题的解数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34584532/
假设您已经用 Python 编写了一个 m x n 矩阵。矩阵之外的值是不可能的。假设你是在矩阵中移动的东西(就像在迷宫中)并且你不能跨越边界。当您在迷宫中移动时,您会不断考虑您的选择,您可以走哪条路
我正在实现随机鼠标算法来探索迷宫。一段时间后,算法陷入无限循环。我调试了一下,它似乎在一条 channel 之间来回卡住了。 请看一下我的算法实现。 这是我的代码:方向是相对于机器人的。 public
我有一个用 java 编写的工作 ascii 迷宫解算器,使用 char 数组,它将正确路径的每个位置设置为前一个位置 + 1。我使用以下代码来从中获取正确路径,但是它仅适用于垂直运动。任何有关此事的
我有一个生成随机迷宫的程序。迷宫中会显示一个红点,并且迷宫中的每个方 block 都会闪烁红点。迷宫中的所有 block 都是 == 1,如果红点穿过该 block ,它就会递增++。红点朝最小数字的
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我创建了一个从文本文件上传的迷宫,该迷宫当前在运行时完全可见且功能正常。但是,我只想将播放的路线显示为可见,因此仅使起始位置和周围的墙壁/地板在开始时可见。有人知道该怎么做吗? 以下是 Board 类
起初我觉得这很容易,但是当我开始做的时候,我不知道如何继续下去了。我的想法是使用面板,然后绘制粗线,但是绘制墙壁并使我的角色不会超出这些墙壁的正确方法是什么?我无法想象我怎么可能做到这一点。这是一个迷
我从一个文件中得到了一个迷宫,我尝试使用一个程序编写一个类Exercise4,该程序将这样的迷宫文件读入二维 boolean 数组。然后在控制台上显示该数组,每一行一行。使用空白符号和 # 符号表示数
如何通过光栅图像数据找到非线性路径?例如,最低成本算法?起点和终点已知,并给出如下: 起点 = (0,0) 终点 = (12,-5) 例如,通过(灰度)光栅图像提取蜿蜒河流的近似路径。 # fake
在我的游戏中,玩家在迷宫中导航。我不知道如何与墙壁进行正确的碰撞检测。停留在某个区域很容易进行碰撞检测: if (x > rightWallX - playerWidth) x = rightWall
基本上,我一直在按照 Java 教程制作一个基本的迷宫游戏,其中我生成一个随机迷宫,并将其保存到文件中,然后使用 Jpanel 将其打印出来,但是在编译时我不断收到此错误。 Exception in
注意:这是 MSVC,C++17 问题。 免责声明:我知道有人尝试过,是的,我试图找到相关的 SO 答案。 我可以编码 UDL , 以实现将数字文字转换为 std::array,在编译时: /
我目前正在开发一个随机迷宫生成器,它将迷宫存储在一个名为 grid 的二维数组中。这将在稍后用于生成一个真正的 3D 迷宫,用户随后可以穿过该迷宫。 在做了一些研究之后,我尝试使用递归除法算法创建这个
题目地址:https://leetcode-cn.com/problems/the-maze-ii/ 题目描述 There is a ball in a maze with empty space
我正在尝试用 python 编写脚本来解决一种具有多个起点和多个终点的迷宫。正确的路径是从起点沿着直线前进。 例如一个有 4 条路径的迷宫: 起初我想使用左手/右手规则,但由于迷宫的特点,它没有太大意
我正在尝试在 opengl 中创建一个简单的 3D 迷宫。我最初的想法是有一个立方体网格,每个立方体的一些面是透明的(用于走廊)。但是,我在想出一种有效执行此操作的方法时遇到了一些麻烦。我不想为我的迷
我的 DFS 算法在解中缺少节点时遇到问题(检查图片)。每次我的算法遇到死胡同时都会发生这种情况:节点从堆栈中弹出并返回,直到找到可用的移动,并且再也不会重新包含在内。有没有一种简单的方法可以在不重新
所以我正在用 Java 构建 pacman 游戏来自学游戏编程。 我有一个基本的游戏窗口,其中绘制了吃 bean Sprite 和幽灵 Sprite ,吃 bean 使用箭头键移动,不会超出窗口的墙壁
我使用的代码只是取自一个示例,它确实为我的场景建了一堵墙: /** This loop builds a wall out of individual bricks. */ public vo
我正在从事一个包含这些条件的学校元素: 只使用 JS、HTML5 和 CSS 制作迷宫。 在 Angular 色周围制作 torch 效果。你不能穿墙照明。 我开始使用 Canvas 制作这款游戏
我是一名优秀的程序员,十分优秀!