继续应用回溯法解决迷宫问题:
问题赘述一下,从一点出发找到出口即可
package 数据结构及算法.回溯法应用之迷宫问题;
import java.util.Iterator;
import 数据结构及算法.回溯法.Application;
import 数据结构及算法.回溯法.Position;
public class Maze implements Application{
private static final byte WALL=0;
private static final byte CORRIDOR=1;//非墙,走廊
private static final byte PATH=9;
private static final byte TRIED=2;
private Position finish;
private byte[][] grid;
public Maze(byte[][]grid,Position finish){
this.finish=finish;
this.grid=grid;
}
@Override
public boolean valid(Position pos) {
if(pos.getRow()>=0&&
pos.getRow()<this.grid.length&&
pos.getColumn()>=0&&
pos.getColumn()<this.grid[0].length&&
grid[pos.getRow()][pos.getColumn()]==this.CORRIDOR){
return true;
}
return false;
}
@Override
public void record(Position pos) {
grid[pos.getRow()][pos.getColumn()]=this.PATH;
}
@Override
public boolean done(Position pos) {
return this.finish.getRow()==pos.getRow()&&this.finish.getColumn()==pos.getColumn();
}
@Override
public void undo(Position pos) {
this.grid[pos.getRow()][pos.getColumn()]=this.TRIED;
}
public String toString(){
String result="";
for(int i=0;i<this.grid.length;i++){
for(int j=0;j<this.grid[0].length;j++){
result+=this.grid[i][j]+" ";
}
result+="\n";
}
return result;
}
@SuppressWarnings("rawtypes")
@Override
public Iterator iterator(Position pos) {
return new MazeIterator(pos);
}
@SuppressWarnings("rawtypes")
private class MazeIterator implements Iterator{
private int row=0;
private int column=0;
private int count=0;
public MazeIterator(Position pos) {
this.row=pos.getRow();
this.column=pos.getColumn();
}
@Override
public boolean hasNext() {
return this.count<4;
}
@Override
public Object next() {
Position nextPosition=new Position();
switch(count){
case 0:nextPosition=new Position(row-1,column);
break;//north
case 1:nextPosition=new Position(row,column+1);
break;//east
case 2:nextPosition=new Position(row+1,column);
break;//south
case 3:nextPosition=new Position(row,column-1);
break;//west
}
count++;
return nextPosition;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
}
初始情况是输入的整个矩阵,1表示可走的,0表示墙
public boolean valid(Position pos)中判断为在矩阵内切非墙有效
在public void record(Position pos)中我让该位置记为9.表示走过
public void undo(Position pos),撤销时与上是逆过程;记为2,
private class QueenIterator implements Iterator为内部类,记录某位置的下一行可选位置,按照北,东,南,西的顺序找
测试程序如下
package 数据结构及算法.回溯法应用之迷宫问题;
import java.util.Scanner;
import 数据结构及算法.回溯法.Application;
import 数据结构及算法.回溯法.BackTrack;
import 数据结构及算法.回溯法.Position;
public class MazeTest {
private byte[][]grid;
public MazeTest(byte[][]grid){
Scanner sc=new Scanner(System.in);
String prompt="请输入四个数字,分别作为迷宫的起始点与终点的row,column坐标!";
System.out.println(prompt);
String s=sc.nextLine();
this.grid=grid;
pocessInput(s);
}
public void pocessInput(String s) {
String[] ss=s.split(" ");
int startR=Integer.parseInt(ss[0]);
int startC=Integer.parseInt(ss[1]);
int finalR=Integer.parseInt(ss[2]);
int finalC=Integer.parseInt(ss[3]);
Position startPosition=new Position(startR,startC);
Position finalPosition=new Position(finalR,finalC);
Application app=new Maze(grid, finalPosition);
BackTrack backTrack=new BackTrack(app);
println("开始为:");
println(app.toString());
if(!app.valid(startPosition)||!app.valid(finalPosition)){
println("failure!");
}
else{
app.record(startPosition);
if(app.done(startPosition)||backTrack.tryToSolve(startPosition)){
println("success");
}
else{
app.undo(startPosition);
println("failure!");
}
}
println("最终为:");
println(app.toString());
}
public void println(String s){
System.out.println(s);
}
public static void main(String[]args){
byte[][] grid={{1,1,1,0,1,1,0,0,0,1,1,1,1},
{1,0,1,1,1,1,0,1,1,1,1,1,0},
{1,0,0,0,1,0,1,0,1,0,1,0,1},
{1,0,0,0,1,1,1,0,1,0,1,1,1},
{1,1,1,1,1,0,0,0,0,1,0,0,0},
{0,0,0,0,1,0,0,0,0,0,0,0,0},
{0,0,0,0,1,1,1,1,1,1,1,1,1}
};
new MazeTest(grid);//测试用例 0 0 6 12
}
}
终于把写的东西弄上来了,希望对和我一样的菜鸟有帮助
分享到:
相关推荐
总的来说,这个项目结合了理论与实践,通过具体的迷宫问题展示了回溯法在解决实际问题中的应用,不仅锻炼了编程技能,也加深了对算法理解。对于初学者来说,这是一个很好的学习案例,可以通过它学习到如何用C语言...
本文将根据给定的程序框图来详细解析回溯法在迷宫问题求解中的应用。 #### 二、程序框图概述 给定的程序框图主要展示了如何通过回溯法解决迷宫问题的过程。其中包含了迷宫探索的基本步骤:确定当前位置、计算可能的...
在本编程演练中,我们将利用VC++2012这一强大的集成开发环境,深入探讨如何应用回溯法来解决迷宫问题。 首先,回溯法是一种试探性的解题方法,它尝试逐步构建解决方案,并在每一步中检查当前选择是否可行。如果不...
对于给定的"用回溯的思想解决迷宫问题"的压缩包文件,可能包含了实现这一算法的源代码,可以下载并研究其具体实现细节,以便更好地理解和应用回溯法解决迷宫问题。 总之,回溯法是一种强大而灵活的解决问题的方法,...
为了将回溯法应用于这一问题,首先要定义解空间,即所有可能的路径。然后,按照深度优先的策略从一个节点出发,尝试所有的移动方向,并记录每一步的位置。如果罗密欧到达了朱丽叶的房间,并且这条路径满足了所有未...
解决此类问题的方法之一就是采用回溯法。 #### 二、核心概念 1. **回溯法**:一种通过尝试解决子问题,并且当发现子问题无解时退回并调整上一步的选择来寻找问题解决方案的方法。 2. **迷宫**:由一系列单元格组成...
在这个主题中,我们聚焦于一种经典的算法——回溯法,以及它在解决背包问题中的应用。回溯法是一种试探性的解决问题的方法,当遇到无法继续进行的情况时,会尝试撤销最近的选择,返回到一个更早的状态,寻找其他可能...
6. **实例分析**:通过详细解析经典例题的编写过程,帮助理解如何将回溯法应用于实际问题中。这可能包括解题思路的阐述,代码实现的步骤,以及剪枝策略的运用。 通过学习本课件,你将能够理解和掌握回溯法的基本...
### 基于迷宫问题的回溯法求解及算法实现 #### 1. 回溯法简介 回溯法是一种系统地搜索问题解的方法,通常用于...回溯法不仅适用于迷宫问题,还可以应用于许多其他类型的路径寻找问题,是一种非常实用且灵活的算法。
标题 "迷宫求解C++源代码(回溯法)" 涉及到的核心知识点是计算机算法中的迷宫求解问题以及编程语言C++的应用,特别是使用回溯法来解决此类问题。回溯法是一种试探性的解决问题的方法,它尝试分步地找到问题的解,...
回溯法是一种强大的搜索策略,常用于解决复杂的问题,如迷宫求解、数独填数、图论中的旅行商问题以及本题中提到的哈密尔顿回路问题。哈密尔顿回路问题是一个著名的图论问题,它询问是否存在一条通过图中每个顶点恰好...
在解决迷宫问题时,回溯法通常被用于寻找从起点到终点的有效路径。这里我们将详细讨论如何利用C语言实现回溯法来解决42x42的迷宫问题。 首先,我们需要设计迷宫的数据结构。一个简单的表示方法是使用二维数组,其中...
回溯法是一种用于解决复杂问题的算法,它通过尝试所有可能的解决方案并逐步构建潜在解来寻找问题的有效解。当发现当前路径无法导出有效解时,算法会回溯到之前的状态,尝试其他可能的分支,以寻找可行的解。这种算法...
回溯法是一种重要的算法策略,常用于解决组合优化问题和逻辑推理问题,如八皇后问题、迷宫求解、数独填空等。在搜索过程中,回溯法采用深度优先搜索的方式,尝试逐步构建可能的解决方案,如果在构建过程中发现当前...
回溯法是一种基于试探性的搜索策略,常用于解决复杂问题,如迷宫求解、棋类游戏等。在C语言中实现回溯法走迷宫,主要涉及以下几个关键知识点: 1. **数据结构**:首先,我们需要定义一个数据结构来表示迷宫。这通常...
下面我们将深入探讨 Turbo C 图形界面的实现以及回溯法在解决迷宫问题上的应用。 Turbo C 是一款经典的 C 语言集成开发环境,它在80年代末至90年代初广泛应用于教学和小型软件开发。尽管现在已被更现代的 IDE 所...
回溯法常常用于解决如迷宫问题、数的拆分、0/1背包问题、八皇后问题等经典问题。 在迷宫问题中,回溯法模拟了一个人在迷宫中尝试各种路径的过程。从起点开始,每次选择一个可能的路径前进,直到遇到死路或者找到...
《迷宫求解问题——C语言实现解析》 在计算机科学领域,迷宫求解问题是一个经典的图论问题,它...通过分析和运行“迷宫最终版”程序,我们可以深入理解迷宫求解的算法逻辑,并从中汲取灵感,应用于更复杂的问题中。
回溯法是一种在搜索解决问题的解空间树时,通过...通过阅读“基于回溯法的罗密欧与朱丽叶的迷宫问题的Matlab实现.pdf”文档,读者不仅可以学习到如何在Matlab中实现回溯法,还能深入理解算法设计和问题求解的思维过程。