【发布时间】:2014-03-17 10:47:48
【问题描述】:
我正在为班级作业编写代码,以使角色通过迷宫。我已经为此工作了几个小时,但我无法弄清楚我做错了什么。角色从左向右和从右向左移动。除非我添加代码让角色围绕块 if (maze.moveRight() == false) 移动,否则它会导致角色在每行末尾上下移动多次,然后再向另一个方向移动。当角色跨行移动时,它也会弄乱我的计数。我觉得我让它变得比它应该的复杂得多。有人可以帮忙吗?
算法
学生总是从左上角开始,即零行零列。
Java 徽标可以位于迷宫中的任何位置,其中还包含显示为“错误方式”标志的障碍物。
你必须按照下面的规则从上到下遍历迷宫中的每一行,直到找到Java标志。
行号和列号从零开始,因此第一行和第一列是索引 0。第二行和第二列是索引 1,依此类推。零是偶数。
在偶数行上,必须使用 maze.moveRight() 从左向右移动,在奇数行上,必须使用 maze.moveLeft() 从右向左移动。
完成每一行后,使用 maze.moveDown() 继续下一行,直到到达最后一行或找到 Java 徽标。
可以通过查看Maze对象中move方法的返回值来检测是否遇到了障碍物,true表示没有障碍物,false表示有障碍物。
如果您在从左向右移动时遇到障碍物:向下、向右、向右和向上移动。 为额外的向右移动调整循环计数器!
如果在从右向左移动时遇到障碍物:向下、向左、向左和向上移动。为额外的左移调整循环计数器!
每次向左或向右移动,不包括避开障碍物时,都必须调用 maze.isDone() 来查看是否找到了 Java 标志。
找到Java标志后,必须立即跳出所有循环,退出程序。
有些迷宫无法使用算法解决,但我们不会用其中任何一个测试您的程序。
public static void main(String[] args) {
// Create maze
String fileName = args[1];
Maze maze = new Maze(fileName);
System.out.println("Maze name: " + fileName);
// Get dimensions
int mazeWidth = maze.getWidth();
int mazeHeight = maze.getHeight();
// Print maze size
System.out.println("Maze width: " + mazeWidth);
System.out.println("Maze height: " + mazeHeight);
int r = 0;
int c = 0;
// Move commands
while (c < maze.getWidth() - 1 && r % 2 == 0 && maze.isDone() == false)
{
maze.moveRight();
maze.isDone();
c++;
if (maze.moveRight() == false && maze.isDone() == false){
maze.moveDown();
maze.moveRight();
maze.moveRight();
maze.moveUp();
}
if (maze.isDone() == true){
System.exit(1);
}
}
while (c == maze.getWidth() - 1 && r % 2 == 0 && maze.isDone() == false)
{
maze.moveDown();
maze.isDone();
r++;
}
while (c != 0 && c <= maze.getWidth() -1 && r % 2 != 0
&& maze.isDone() == false){
maze.moveLeft();
maze.isDone();
c--;
if (maze.moveLeft() == false && maze.isDone() == false) {
maze.moveDown();
maze.moveLeft();
maze.moveLeft();
maze.moveUp();
}
if (maze.isDone() == true){
System.exit(1);
}
}
}
【问题讨论】:
-
使用蛮力解决不了这个问题。您应该查看backtracking 算法。
-
Luiggi 的评论是正确的。使用递归的回溯算法将是解决此问题的最简单方法。
-
感谢您的建议。不幸的是,我的任务只允许我从左到右或从右到左穿过每一行,绕着(错误的方式)标志移动并继续沿着同一行向下直到字符到达(Java 符号)图标。但是,如果使用回溯算法可以做到这一点,我完全赞成。
-
回溯算法中涵盖的所有内容。事实上,学习回溯的常见练习之一就是解迷宫……
-
我不知道迷宫的结构是什么,但你的代码表明你只在偶数行上向右移动,在奇数行上向左移动。它还表明您只能向下移动增加右侧墙上的行数。该模式是否描述了您试图实现的行为?