这个带野可以用 堆栈 来完成。
网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、成都微信小程序、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了仙游免费建站欢迎大家使用!
用堆栈的基本思路就是。
设置一个起点A。将 A 入栈 。
从A开始找到第一个可以达到的点B。将 B 入栈 。
如果B无路可走。则谈桥在A点处重新换一个可达到的点。否则继续 2-3 。直到达到终点。或者五路可走。
详细的解释,含行猛这儿有一篇博文:
你这个方法太复杂了,用回溯法原理上比较简念薯蚂单,你先把while((stack!=NULL)||((stack-row!=x2)(stack-col!=y2))){改成while(1)试试,不行的话,下面这个方法是我以前编写的,你可以看看
#includestdio.h
#includestdlib.h
#define N 50
int **maze;
int row;
int col;
int stack[50];//存放路径的栈
void CreateMaze()//用于动态创建迷宫
{
int i,j;
printf("请输入迷宫的行数:");
scanf("%d",row);
printf("请输入迷宫的列数:");
scanf("%d",col);
if(row=0||col=0)
{
printf("输入的行数或列数不符合规则!\n");
exit(1);
}
//利用指针的指针动态创建二维数组
maze=(int **)malloc((row+2)*sizeof(int *));
for(i=0;irow+2;i++)
{
maze[i]=(int *)malloc((col+2)*sizeof(int));
}
//加边墙
for(i=0;irow+2;i++)
{
maze[i][0]=1;
maze[i][col+1]=1;
}
for(i=0;icol+2;i++)
{
if(i==1)
{
maze[0][i]=0;
}
else maze[0][i]=1;
if(i==col)
{
maze[row+1][col]=0;
}
else maze[row+1][i]=1;
}
for(i=1;i=row;i++)
{
for(j=1;j=col;j++)
{
printf("请输入第%d行的第%d个数:\n",i,j);
scanf("%d",maze[i][j]);
}
}
//输入下一个当前加边墙的迷宫,以验证输入是否正确
printf("输入完仔埋毕!当前加边墙的迷宫为:\n");
for(i=0;irow+2;i++)
{
for(j=0;jcol+2;j++)
{
printf("%d",maze[i][j]);
}
printf("\n");
}
}
void ShowMaze()//输出迷宫
{
int i,j;
for(i=1;i=row;i++)
{
for(j=1;j=col;j++)
{
printf("%d",maze[i][j]);
}
printf("\n");
}
}
//释放迷宫数组
void DestroyMaze()
{
int i;
for(i=0;irow+2;i++)
free(maze[i]);
free(maze);
}
//用DFS方法来实现回溯,找到迷宫的一条解路径
int FindPath()
{
int i,j,k,count,x,y,direction;
count=0;
x=1,y=1;
direction=0;
j=0,k=0;
for(i=0;iN;i++)
{
stack[i]=0;
}
i=0;
while(1)
{
count=0;/手衡/用count判断是否有路可走
{
if(x==1y==1)
maze[x][y]=2;
if(maze[x][y+1]==0)//东
{
count++;
maze[x][y+1]=2;
y=y+1;
stack[i]=-1;
i++;
if(x==rowy==col)
return 1;
}
else if(maze[x+1][y]==0)//南
{
if(maze[x+1][y]==0)
count++;
{
maze[x+1][y]=2;
x=x+1;
stack[i]=-2;
i++;
if(x==rowy==col)
return 1;
}
}
else if(maze[x][y-1]==0)//西
{
count++;
if(maze[x][y-1]==0)
{
maze[x][y-1]=2;
y=y-1;
stack[i]=-3;
i++;
if(x==rowy==col)
return 1;
}
}
else if(maze[x-1][y]==0)//北
{
count++;
if(maze[x-1][y]==0)
{
maze[x-1][y]=2;
x=x-1;
stack[i]=-4;
i++;
if(x==rowy==col)
return 1;
}
}
}
if(count==0)
{
if(i0)
return 0;
direction=stack[i--];
switch(direction)
{
case -1:y=y-1;break;
case -2:x=x-1;break;
case -3:y=y+1;break;
case -4:x=x+1;break;
default:break;
}
}
}
}
int main()
{
CreateMaze();
if(FindPath())
{
printf("已经找到了一条路径,如下:\n");
ShowMaze();
}
else
{
printf("没有合适的路径走出当前迷宫!\n");
}
DestroyMaze();
}
//这是JDK提供的栈
import java.util.Stack;
public class UsingStack {
public static void main(String[] args) {
//构造栈对象,使用类型限制,只能存储Integer数据
StackInteger s = new Stack袜衫Integer();
//1、2、3依次入栈
s.push(1);
s.push(2);
s.push(3);
//3、2、1依次出亮尺栈
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
}
}
//这是我写的顺序结构的栈
import java.util.EmptyStackException;
import java.util.Vector;
public class UsingStack{
public static void main(String[] args){
//构造栈对象,使用类型限告键腔制,只能存储Integer数据
MyStackInteger s = new MyStackInteger();
//1、2、3依次入栈
s.push(1);
s.push(2);
s.push(3);
//3、2、1依次出栈
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
}
}
/**
* 栈类
* @author developer_05
* @param T
*/
class MyStackT extends VectorT{
/**
* 构造方法
*/
public MyStack(){
}
/**
* 入栈方法
* @param item 待入栈的元素
* @return 返回入栈的元素
*/
public T push(T item) {
addElement(item);
return item;
}
/**
* 出栈方法(同步处理)
* @return 返回出栈元素
*/
public synchronized T pop() {
T obj;
int len = size();
if (len == 0)
throw new EmptyStackException();
obj = elementAt(len - 1);
removeElementAt(len - 1);
return obj;
}
/**
* 判断栈是否为空的方法
* @return 返回true(栈空)或false(栈非空)
*/
public boolean empty() {
return size() == 0;
}
private static final long serialVersionUID = 1L;
}
#include stdio.h
#include time.h
#include stdlib.h
#include string.h
#define MAXM 40
#define MAXN 60
int maze[MAXM][MAXN]; // 0 1-障碍物
int m = 40, n = 60; // 40行60列
int used[MAXM][MAXN]; // 记录是否到过
int line[MAXM*MAXN]; // 记录迷宫路线
int line_len;
int line_r[MAXM*MAXN];
int d[4][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1} }; // 4个方向
void dfs(int u, int v, int step)
{
int x, y, i;
if (line_len != 0)
return;
if (u == m-1 v == n-1)
{
line_len = step;
memcpy(line_r, line, line_len*sizeof(int));
return;
}
for (i = 0; i 4; i++)
{
x = u + d[i][0];
y = v + d[i][1];
if (x = 0 x m y = 0 y n !used[x][y] maze[x][y]==0)
{
used[x][y] = 1;
line[step] = x 16 | y;
dfs(x, y, step+1);
含山 // used[x][y] = 0; // 不用退回来了,因为只需要一条路径
}
}
}
int main()
{
int i, j;
// 随机生成迷宫
srand(time(NULL));
for (i = 0; i m; i++)
for (j = 0; j n; j++)
maze[i][j] = rand()%8 == 0 ? 1 : 0; // 是1的概率约1/8,通路的概率大些
maze[0][0] = maze[m-1][n-1] = 0; // 起始点和终端必须为0
line_len = 0;
line[0] = 0 16 | 0;
memset(used, 0, sizeof(used));
dfs(0, 0, 0); // (0,0) - (m-1, n-1)
if (line_len == 0)
printf("没有通路\n");
else
{
for (i = 0; i line_len; i++)
printf("( %d, %d )\n", (line_r[i]16)+1, (line_r[i]0xffff)+1);
}
return 0;
}
你给的那库实在是没什枝老则么用的欲望,要最短路猛棚径一般用广度搜索,上面的代码应该属于深度搜索