- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
嗨~我陷入了这个问题。有人请帮助我!!!!
问题是程序会要求用户输入 4 到 20 之间的数字来决定迷宫的大小。稍后它会要求用户逐行输入迷宫的内容,并将其存储到一个 2D bool 数组中(true 表示阻塞,false 表示清除)。然后程序从左上角开始,试图找到一条通向右下角的路径(可以向右、向左、向上、向下移动)。这时,程序还应该维护另一个char数组,记录找到的路径(如果有的话),并在处理结束时打印出来。这个问题要求用递归来解决。
这是我现在得到的:
#include<iostream>
using namespace std;
int row, col;
int size=0;
bool maze[21][21];
char print[22][22];
const char start = 's', up = 'u', down = 'd', left = 'l', right = 'r', barrier = 'x';
char path(int coorx, int coory, int size)
{
if(maze[coorx][coory+1]=0)
{
print[coorx+1][coory+2]='r';
return path(coorx,coory+1,size);
}
else
{
if(maze[coorx+1][coory]=0)
{
print[coorx+2][coory+1]='d';
return path(coorx+1,coory,size);
}
else
{
if(maze[coorx][coory-1]=0)
{
print[coorx+1][coory]='l';
return path(coorx,coory-1,size);
}
else
{
if(maze[coorx-1][coory]=0)
{
print[coorx][coory+1]='u';
return path(coorx-1,coory,size);
}
}
}
}
}
int main()
{
while(size<4 || size>20)
{
cout<<"Please input size of maze (a number between 4 and 20 is expected) -> ";
cin >>size;
if(size<4 || size>20)
cout<<"**Error** maze size not in range!"<<endl;
}
cout<<"Please input contents of maze row by row, 1 for barrier and 0 for free passage."<<endl;
cout<<endl;
for(int i=1; i<size+1; i++)
{
for(int j=1; j<size+1; j++)
cin>>maze[i][j];
}
if(maze[1][1]==1)
cout<<"**Error** entrance to maze is blocked!"<<endl;
else
{
// find the path
for(int coorx=0;coorx<size;coorx++)
{
for(int coory=0;coory<size;coory++)
path(coorx,coory,size);
}
cout<<"The maze and the path:"<<endl;
// print the forum (adding characters '+','-', ' ')
print[0][0]=print[size+1][size+1]=print[0][size+1]=print[size+1][0]='+';
print[1][1]='s';
for(int x=1; x<size+1; x++)
{
for(int y=0; y<size+2; y++){
if(y==0 || y==size+1)
{
print[x][y]='|';
}
}
}
for(int x=0; x<size+2; x++)
{
for(int y=0; y<size+2; y++){
if(x==0 || x== size+1){
if(y!=0 && y!=size+1)
print[x][y]='-';
}
}
}
for(int row=0; row<size+2; row++)
{
for(int col=0; col<size+2; col++)
{
if(maze[row][col]==1)
print[row][col]='x';
}
}
// print out the record of the path found
for(int row=0; row<size+2; row++)
{
for(int col=0; col<size+2; col++){
cout<<print[row][col];
}
cout << endl;
}
}
return 0;
}
我不知道为什么我不能显示那些 'r'、'd'、'l'、'u'。我已经将它们分配给 print[][]
,但为什么它不显示为什么我打印出 print[][]
??
新编码
#include<iostream>
using namespace std;
int row,col;
int size=0;
bool maze[20][20];
char print[22][22];
bool path(int coorx, int coory, int size)
{
if(coorx==size-1 && coory==size-1)
return true;
if(!maze[coorx][coory+1] && path(coorx,coory+1,size))
return true;
return 'r';
if(!maze[coorx+1][coory] && path(coorx+1,coory,size))
return true;
return 'd';
if(!maze[coorx][coory-1] && path(coorx,coory-1,size))
return true;
return 'l';
if(!maze[coorx-1][coory] && path(coorx-1,coory,size))
return true;
return 'u';
}
int main()
{
while(size<4 || size>20)
{
cout<<"Please input size of maze (a number between 4 and 20 is expected) -> ";
cin >>size;
if(size<4 || size>20)
cout<<"**Error** maze size not in range!"<<endl;
}
cout<<"Please input contents of maze row by row, 1 for barrier and 0 for free passage."<<endl;
cout<<endl;
for(int i=0; i<size; i++)
{
for(int j=0; j<size; j++)
cin>>maze[i][j];
}
if(maze[0][0]==1)
cout<<"**Error** entrance to maze is blocked!"<<endl;
else
{
int row=0;
int col=0;
path(row,col,size);
if(!path(row,col,size))
{
cout<<"**Warning** no path from entrance to exit!"<<endl;
}
else
{
if('r')
print[row+2][col+3]='r';
if('d')
print[row+3][col+2]='d';
if('l')
print[row+2][col+1]='l';
if('u')
print[row+1][col+2]='u';
}
cout<<"The maze and the path:"<<endl;
// print the forum (adding characters '+','-', ' ')
print[0][0]=print[size+1][size+1]=print[0][size+1]=print[size+1][0]=='+';
print[1][1]='s';
for(int x=1; x<size+1; x++)
{
for(int y=0; y<size+2; y++){
if(y==0 || y==size+1)
{
print[x][y]=='|';
}
}
}
for(int x=0; x<size+2; x++)
{
for(int y=0; y<size+2; y++){
if(x==0 || x== size+1){
if(y!=0 && y!=size+1)
print[x][y]=='-';
}
}
}
for(int row=0; row<size; row++)
{
for(int col=0; col<size; col++)
{
if(maze[row][col]==1)
print[row+1][col+1]=='x';
}
}
path(0,0,size);
// pirnt out the record of the path found
for(int row=0; row<size+2; row++)
{
for(int col=0; col<size+2; col++){
cout<<print[row][col];
}
cout << endl;
}
}
return 0;
}
迷宫大小=4
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
样本运行看起来像
s r r r
d
d
d
但是我的程序是这样运行的
s r
后来没有了,不知道为什么
最佳答案
在 if(maze[coorx][coory+1]=0)
(以及类似的)path()
语句中,单个等号是赋值运算符,因此它的计算结果始终为 false。
由于 maze
是一个 bool 数组,您应该只使用 if(!maze[coorx][coory + 1])
。
print
应该是一维数组而不是二维数组,因为它只需要跟踪“r”、“l”、“d”和“u” ",而不是您执行这些操作的单元格。
在 path()
中,您要提前返回
而不是回溯。只有路径存在才返回,可以通过递归判断路径是否存在。
换句话说,path()
函数需要重写为如下所示:
/* returns true if there's a path to the bottom right cell, otherwise false */
bool path(int coorx, int coory, int size) {
if(coorx == size - 1 && coory == size - 1) { // exit of maze
return true;
}
if(!maze[coorx][coory + 1] && path(coorx, coory + 1, size)) {
// add "right" to your path
return true;
}
if(!maze[coorx + 1][coory] && path(coorx + 1, coory, size)) {
// add "down" to your path
return true;
}
// etc...
}
当然,你也应该添加边界检查。
并且,path
将在递归结束时向后,但您可以将其反转。
您应该只在左上角的单元格中调用一次 path()
函数,而不是在每个单元格中调用一次。递归将处理对迷宫所有单元格的搜索。
if(maze[1][1]==1)
in main()
应该是 if(maze[0][ 0])
而不是,因为您显然是想从左上角的单元格开始。
一旦递归工作,您可以简单地在 path()
中添加到 print
:
bool path(int coorx, int coory, int size, int depth) {
// if(coorx == size - 1 ... base case
if(!maze[coorx][coory + 1] && path(coorx, coory + 1, size, depth + 1)) {
print[coorx][coory + 1] = 'r';
return true;
}
// etc...
}
您在 main()
中调用了三次 path()
。只需调用一次并将结果存储在 bool 值中。
您没有正确打印路径。示例输出在 print
中打印出每个单元格的字符——您也应该这样做。
关于c++ - 使用递归在迷宫中找到路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26808138/
假设您已经用 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 制作这款游戏
我是一名优秀的程序员,十分优秀!