网站建设资讯

NEWS

网站建设资讯

JAVA迷宫代码堆栈算法 java 走迷宫

求助 java一个二维数组代表迷宫。0代表道路 2表示墙壁。 假设老鼠会从数组[1][0]开始

这个带野可以用 堆栈 来完成。

网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、成都微信小程序、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了仙游免费建站欢迎大家使用!

用堆栈的基本思路就是。

设置一个起点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();

}

Java如何实现堆栈

//这是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;

}

你给的那库实在是没什枝老则么用的欲望,要最短路猛棚径一般用广度搜索,上面的代码应该属于深度搜索


分享标题:JAVA迷宫代码堆栈算法 java 走迷宫
当前地址:http://njwzjz.com/article/ddpjsgd.html