java迷宫实训报告_Java学习迷宫求解器

本文探讨了一种使用Java实现的迷宫求解算法,通过堆栈记录机器人在遇到不同出口情况下的方向。在回溯和探索模式中,机器人试图找到最佳路径。然而,目前的算法在处理交叉点时只会直行,导致无法找到最优解。作者正寻求改进方法以优化路径选择。
摘要由CSDN通过智能技术生成

我一直在研究一些代码来指导一个“机器人”通过一个有多个死角的迷宫和一条正确的目标路径,如下所示:

081516cd960b7f9d9be389bd82d000bd.png

我已经使用了一个堆栈来记录机器人第一次到达一个有3或4个可能出口的正方形时所面对的方向,如果所有相邻的正方形都已被访问过,则使用pop()使机器人从第一个方向返回来自(到达方向对面) . 在运行结束时,堆栈包含到达目标路径上的所有方块的方向 . 沿着堆叠的相反方向将机器人从目标返回到起点 . 我正在努力找出如何使用这个堆栈,以便在下一次运行时机器人将采取最佳路径来达到目标 .

我的一些代码:

private int pollRun = 0; // Incremented after each pass

private int explorerMode; // 1 = explore, 0 = backtrack

public void exploreControl(IRobot robot) {

byte exits = nonwallExits(robot);

int direction;

switch (exits) { //passes control to respective method

case 1: direction = deadEnd(robot); break;

case 2: direction = corridor(robot); break;

case 3: direction = junction(robot); break;

default: direction = crossroads(robot); break;

}

if (exits == 1) {explorerMode = 0;}

robot.face(direction);

pollRun++;

}

public void backtrackControl(IRobot robot) {

byte exits = nonwallExits(robot);

int direction = IRobot.CENTRE;

switch (exits) { //passes control to respective method

case 1: direction = deadEnd(robot); break;

case 2: direction = corridor(robot); break;

default: direction = junction(robot); break; // do nothing

}

if (exits > 2) {

if (passageExits(robot) > 0){

exploreControl(robot);

explorerMode = 1;

pollRun++;

return;

} else {

robot.setHeading(st.pop());

robot.face(IRobot.BEHIND);

pollRun++;

return;

}

}

robot.face(direction);

pollRun++;

}

public void optimal(IRobot robot) {

byte exits = nonwallExits(robot);

int direction;

int heading;

for(int i = 0; i < st.size(); i++) {

stNew.push(st.pop());

}

if (exits < 3) {

switch (exits) { //passes control to respective method

case 1: direction = deadEnd(robot); break;

default: direction = corridor(robot); break;

}

robot.face(direction);

} else {

robot.setHeading(stNew.pop());

}

}

public void controlRobot(IRobot robot) {

if ((robot.getRuns() == 0) && (pollRun == 0)) {

robotData = new RobotData(); //reset the data store

explorerMode = 1;

}

if (robot.getRuns() = 1) {

optimal(robot);

return;

}

if (robot.getRuns() <= 0 && (nonwallExits(robot) >= 3)

&& (beenbeforeExits(robot) <= 0)) {

st.push(robot.getHeading());

}

if (explorerMode == 1) {

exploreControl(robot);

} else {backtrackControl(robot);}

}

最佳方法显示了我尝试解决它,但它所做的只是让机器人在每个交叉点直线前进

比如这个迷宫,

58249324557b28bca386e3688cd1aa89.png

会留下我的堆栈:EAST,EAST,SOUTH,SOUTH,EAST,SOUTH,SOUTH,EAST,EAST,SOUTH,SOUTH,EAST,EAST,EAST,SOUTH,EAST,SOUTH

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值