再过两个月就要软考了,在准备的过程中,我发现算法是我的软肋,尤其是递归和回溯,一直不是很明白。最近在书上看了个题目,是迷宫问题。虽然我知道这种问题要采用回溯,反复试探,但具体到代码实现,就力不从心。于是认真阅读了C代码,自认为有点头绪了,就改成java重新实现一下。虽然大致结构没变,但通过自己写,感觉提高了不少。以下是代码:
public class Maze {
/*迷宫行数*/
public static final int M = 12;
/*迷宫列数*/
public static final int N = 15;
/*迷宫图,0代表通,1代表不通*/
/*最终解的路径上的元素置为8,曾经到达过,但无路可走而被迫回溯的元素置为4*/
public static int p[][]=
{
{0,1,0,0,0,1,1,0,0,0,1,1,1,1,1},
{1,0,0,0,1,1,0,1,1,1,0,0,1,1,1},
{0,1,1,0,0,0,0,1,1,1,1,0,0,1,1},
{1,1,0,1,1,1,1,0,1,1,0,1,1,0,0},
{1,1,0,1,1,1,1,0,1,1,0,1,1,0,0},
{1,1,0,1,0,0,1,0,1,1,1,1,1,1,1},
{0,0,1,1,0,1,1,1,0,1,0,0,1,1,1},
{0,1,1,1,1,0,0,1,1,1,1,1,1,1,1},
{0,0,1,1,0,1,1,0,1,1,1,1,1,0,1},
{1,1,0,0,0,1,1,0,1,1,0,0,0,0,0},
{0,0,1,1,1,1,1,0,0,0,1,1,1,1,0},
{0,1,0,0,1,1,1,1,1,0,1,1,1,1,0}
};
public static void maze(int p[][],int m,int n)
{
/*行前进方向:右、右下,下、左下、左、左上、上、右上*/
int is[] = {0,1,1,1,0,-1,-1,-1};
/*列前进方向:右、右下,下、左下、左、左上、上、右上*/
int js[] = {1,1,0,-1,-1,-1,0,1};
int stack[] = new int[3*M*N];
int top;
int i,j,v,g,h,jt = 0;
top = 0;
i =j = v = 0;
if(p[0][0]!=0)/*入口无路可走,提示无路,返回*/
{
p[0][0] = 4;
System.out.println("No Path!");
return;
}
while(top!=0||v!=7)/*只要没有退回到起点或者其余7个方向还有方向没走*/
{
/*选择一个方向*/
g = i+is[v];
h = j+js[v];
jt = 0;
if(g>-1&&g<m&&h>-1&&h<n)
{
/*已经到达了中点*/
if(g==m-1&&h ==n-1&&p[m-1][n-1]==0)
{
p[i][j] = 8;
p[g][h] = 8;
return; /*找到路径,返回*/
}
/*有通路*/
if(p[g][h]==0)
{
p[g][h] = 4;
p[i][j] = 8; /*前一步位置上置为8*/
/*入栈,记录下前一步*/
stack[top]=i;
stack[top+1]=j;
stack[top+2]=v;
top += 3;
i = g;
j = h;
v = 0;
jt = 1; /*标记为新发现的节点*/
}
}
if(jt == 0)
{
/*换个方向试试*/
if(v<7)
{
v++;
}
/*所有方向都试完了,开始回溯*/
else
{
/*如果上个结点也走投无路的,循环往上回退*/
while(top!=0 && stack[top-1]==7)
{
p[stack[top-3]][stack[top-2]]=4;/*无路,栈中元素置为4,并退栈*/
top-=3;
}
/*继续搜索上一个节点的其它方向*/
if(top!=0)
{
i = stack[top-3];
j = stack[top-2];
v = stack[top-1];
p[i][j] = 4;
top-=3;
}
}
}
}
System.out.println("No Path!");
return;
}
public static void main(String[] args) {
int i,j;
maze(p,12,15);
for(i = 0;i<M;i++)
{
for(j = 0;j<N;j++)
{
System.out.print(p[i][j]);
}
System.out.println();
}
}
}
分享到:
相关推荐
迷宫问题,迷宫问题.doc
表面上似乎迷宫问题是一种特殊问题的解决方法,其实迷宫问题是一种特殊形式图的问题,因此,迷宫总量可转化为图的问题来解决。设计一个计算机程序对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论...
数据结构实验迷宫问题实验报告
数据结构 迷宫问题 希望有用 ,不好意思 数据结构 迷宫问题 希望有用
C++数据结构练习题,利用队列解决迷宫问题,完成出路的寻找
此代码展示了一种用递归解决迷宫问题的方法,可以自行输入迷宫即得到解答
用c++写的有关迷宫问题的算法,源程序,希望对大家有用!
迷宫问题用队列解决,并求得最短路径,绝对源码
1、用堆栈实现迷宫问题 2、用回溯法实现迷宫问题
本科生计算机相关专业 人工智能课程 A*算法解决迷宫问题C++代码 详细注释,易懂
迷宫问题 数据结构 湖南大学
主要介绍了Python基于递归算法实现的走迷宫问题,结合迷宫问题简单分析了Python递归算法的定义与使用技巧,需要的朋友可以参考下
在求解迷宫问题的过程中,当沿某一条路径一步步走向出口但发现进入死胡同时,就回溯一步或多步,寻求其它可走路经。在迷宫中任意时刻的位置可用数组行下标 i和列下标j表示。从Maze[i][j]出发,可能的前进方向有4个,...
数据结构中用邻接表求解迷宫问题,该算法运用了简单的原理,但是非常实用的解决了迷宫问题
迷宫问题非递归,可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;
首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫问题的非递归算法。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的位置,d表示走到下一个坐标的方向。如:对于下列数据的迷宫,输出...
迷宫问题 综合运用数组、递归等数据结构知识,掌握、提高分析、设计、实现及测试程序的综合能力。 [实验内容及要求] 以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫...
用栈的思想解决迷宫问题,获得一条通路,迷宫是随机生成的,如果没有通路就显示无法通过
数据结构中,关于迷宫问题的源代码(C语言)。课程作业是解决迷宫求解的问题,从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。...
迷宫可自己设置,1表示墙壁,0表示可通过,起点和终点在代码中选择基于广度优先搜索的迷宫问题解法,包含了两个迷宫实例