`
nmj1987
  • 浏览: 30078 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
文章分类
社区版块
存档分类
最新评论

迷宫问题

阅读更多

再过两个月就要软考了,在准备的过程中,我发现算法是我的软肋,尤其是递归和回溯,一直不是很明白。最近在书上看了个题目,是迷宫问题。虽然我知道这种问题要采用回溯,反复试探,但具体到代码实现,就力不从心。于是认真阅读了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();
		}

	}

}
 
1
1
分享到:
评论
1 楼 wonderlandsh 2009-06-15  
有C代码实现的吗?

相关推荐

    迷宫问题,迷宫问题.doc

    迷宫问题,迷宫问题.doc

    回溯算法求解迷宫问题

    表面上似乎迷宫问题是一种特殊问题的解决方法,其实迷宫问题是一种特殊形式图的问题,因此,迷宫总量可转化为图的问题来解决。设计一个计算机程序对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论...

    数据结构实验迷宫问题实验报告

    数据结构实验迷宫问题实验报告

    数据结构 迷宫问题 数据结构 迷宫问题

    数据结构 迷宫问题 希望有用 ,不好意思 数据结构 迷宫问题 希望有用

    利用队列实现迷宫问题

    C++数据结构练习题,利用队列解决迷宫问题,完成出路的寻找

    递归法解决迷宫问题

    此代码展示了一种用递归解决迷宫问题的方法,可以自行输入迷宫即得到解答

    迷宫问题c++源程序

    用c++写的有关迷宫问题的算法,源程序,希望对大家有用!

    迷宫问题用队列解决

    迷宫问题用队列解决,并求得最短路径,绝对源码

    用2中方法解决迷宫问题

    1、用堆栈实现迷宫问题 2、用回溯法实现迷宫问题

    迷宫问题A*算法

    本科生计算机相关专业 人工智能课程 A*算法解决迷宫问题C++代码 详细注释,易懂

    数据结构迷宫问题

    迷宫问题 数据结构 湖南大学

    Python基于递归算法实现的走迷宫问题

    主要介绍了Python基于递归算法实现的走迷宫问题,结合迷宫问题简单分析了Python递归算法的定义与使用技巧,需要的朋友可以参考下

    迷宫问题的解决

    在求解迷宫问题的过程中,当沿某一条路径一步步走向出口但发现进入死胡同时,就回溯一步或多步,寻求其它可走路经。在迷宫中任意时刻的位置可用数组行下标 i和列下标j表示。从Maze[i][j]出发,可能的前进方向有4个,...

    用邻接表求解迷宫问题

    数据结构中用邻接表求解迷宫问题,该算法运用了简单的原理,但是非常实用的解决了迷宫问题

    迷宫问题非递归

    迷宫问题非递归,可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;

    迷宫 c语言迷宫问题

    首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫问题的非递归算法。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的位置,d表示走到下一个坐标的方向。如:对于下列数据的迷宫,输出...

    迷宫问题课程设计 C语言编写

    迷宫问题 综合运用数组、递归等数据结构知识,掌握、提高分析、设计、实现及测试程序的综合能力。 [实验内容及要求] 以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫...

    栈的思想解决迷宫问题

    用栈的思想解决迷宫问题,获得一条通路,迷宫是随机生成的,如果没有通路就显示无法通过

    数据结构,迷宫问题C语言版源代码

    数据结构中,关于迷宫问题的源代码(C语言)。课程作业是解决迷宫求解的问题,从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。...

    广度优先搜索解决迷宫问题_迷宫问题_

    迷宫可自己设置,1表示墙壁,0表示可通过,起点和终点在代码中选择基于广度优先搜索的迷宫问题解法,包含了两个迷宫实例

Global site tag (gtag.js) - Google Analytics