【迷宫问题】大家帮我看下这个这段代码,或者帮忙写个迷宫算法

孤鸿掠影 2011-03-26 02:42:26
大家好,想写个迷宫算法,目的是搜集完迷宫中的所有beeper,我的大致思想主要是贴墙走,就是能靠右走就靠右走,不能靠右就往前,不能往前才向左。但是如果迷宫中有“孤岛”就不行,所以我用likedList来储存已经走过的格子,如果第二次走到这里,就让它左转,第三次就左转两次,那么第五次就是和第一次的情况一模一样了,此时任务完成,程序结束。
代码如下,但是就是不行,请大家帮我看看算法上有什么问题。
move(),turnLeft()这些方法我都有,关键是思想和算法上错误。

如果能提供你们的迷宫算法就更好了,谢谢!


public class SampleKarel extends SuperKarel {

int count = 0;
boolean flag = true;

LinkedList<Node> list = new LinkedList<Node>();

String beeperStr = JOptionPane.showInputDialog("请输入所要pick的beeper个数:");
int beeperInt = Integer.parseInt(beeperStr);

public void run() {
while(count < beeperInt && flag){
judgeAndPick();
Node n = new Node(getLocation(),getDirection());
if (list.contains(n)) {
switch ((list.get(list.indexOf(n))).getCount()) {
case 1:
turnLeft();
break;
case 2:
turnLeft();
turnLeft();
break;
case 3:
turnRight();
break;
case 4:
JOptionPane.showMessageDialog(null, "你已经完成任务了!");
flag = false;
break;
}
} else {
list.add(n);
}
if (frontIsBlocked() || rightIsClear()) {
changeDirection();
}
move();
}


}


public void changeDirection() {

if (rightIsClear()) {
turnRight();
} else {
if (leftIsBlocked()) {
turnLeft();
}
turnLeft();
}

}

public void judgeAndPick() {

if (beepersPresent()) {
pickBeeper();
count++;
}

}


class Node {
private java.awt.Point pt;
private int dir;
private int count = 1;

public Node() {
}

public Node(java.awt.Point pt, int dir) {
this.pt = pt;
this.dir = dir;
}

public int getCount() {
return count;
}

public void addCount() {
count++;
}

public boolean equals(Object obj) {
Node n = (Node)obj;
if (n == null) {
return false;
} else if (this.pt == n.pt && this.dir == n.dir){
return true;
}
return false;
}
}
...全文
137 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤鸿掠影 2011-03-26
  • 打赏
  • 举报
回复
感谢2楼,你说的我都注意到了,但是在代码实现方面到底出现什么问题。
感谢3楼。
感谢4楼,你说的堆栈来储存好像有点道理,但是我不知道在细节处理上会不会存在问题,先试一下。
vicen25 2011-03-26
  • 打赏
  • 举报
回复
深度搜索,应该不需要用LinkList来存储已走过的格,只需要用个所谓“先进后出”的堆栈来存储就够了,走过的格子应该设为一个禁区,例如墙。这样就不会出现重复走同一个格子。
zqfddqr 2011-03-26
  • 打赏
  • 举报
回复
破迷宫时有很多算法的 a* 蚁群等等

a*的http://www.leyond.info/source-code-of-a-start-algorithm/

蚁群http://wenku.baidu.com/view/d4ef4ed276a20029bd642d6b.html
孤鸿掠影 2011-03-26
  • 打赏
  • 举报
回复
怎么没人回答啊,再给自己顶一下。
aaaxjmbbb 2011-03-26
  • 打赏
  • 举报
回复
算法没看,你的“贴墙走是”在真的贴墙走还是指“当遇到障碍的时候再向右”,前者可以,具体原理请看代数拓扑,后者的话根本没任何道理,就像你说的“孤岛”,你用likedList来储存也不行的原因可能是因为你没有记录当时的朝向(我没看代码,不确定)。所以可能第二次左传一次与第一经过这里的路线是一样的。迷宫问题就“贴墙走”和回溯,其实原理都是利用“道路连通性”,至于哪个快看具体迷宫的边界和“面积”的“量化参数”的关系了。
孤鸿掠影 2011-03-26
  • 打赏
  • 举报
回复
大家再帮帮忙啊。。。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧