请帮忙用数据结构(java版)的知识解决这道迷宫问题的程序代码。

请帮忙用数据结构(java版)的知识解决这道迷宫问题的程序代码。,第1张

我这是用c写的。你可以看看,希望能帮助到你。

#include"stdlib.h"

#include"stdio.h"

#define N 50

#define M 50

int X

int maze[N+2][M+2]

struct point{

int row,col,predecessor

}queue[512]

int head=0,tail=0

void shoudong_maze(int m,int n){

int i,j

printf("\n\n")

printf("请按行输入迷宫,0表示通路,1表示障碍:\n\n")

for(i=0i<mi++)

for(j=0j<nj++)

scanf("%d",&maze[i][j])

}

void zidong_maze(int m,int n){

int i,j

printf("\n迷宫生成中……\n\n")

system("pause")

for(i=0i<mi++)

for(j=0j<nj++)

maze[i][j]=rand()%2

//由于rand()产生的随机数是从0到RAND_MAX

//RAND_MAX是定义在stdlib.h中的,其值至少为32767)

//要产生从X到Y的数,只需要这样写:k=rand()%(Y-X+1)+X

}

void print_maze(int m,int n){

int i,j

printf("\n迷宫生成结果如下:\n\n")

printf("迷宫入口\n")

printf("↓")

for(i=0i<mi++)

{printf("\n")

for(j=0j<nj++)

{if(maze[i][j]==0) printf("□")

if(maze[i][j]==1) printf("■")}

}

printf("→迷宫出口\n")

}

void result_maze(int m,int n)

{ int i,j

printf("迷宫通路(用☆表示)如下所示:\n\t")

for(i=0i<mi++)

{ printf("\n")

for(j=0j<nj++)

{if(maze[i][j]==0||maze[i][j]==2) printf("□")

if(maze[i][j]==1) printf("■")

if(maze[i][j]==3) printf("☆")

}

}

}

void enqueue(struct point p)

{ queue[tail]=p

tail++

}

struct point dequeue()

{ head++

return queue[head-1]

}

int is_empty()

{ return head==tail

}

void visit(int row,int col,int maze[52][52])

{ struct point visit_point={row,col,head-1}

maze[row][col]=2

enqueue(visit_point)

}

int mgpath(int maze[52][52],int m,int n)

{ X=1

struct point p={0,0,-1}

if(maze[p.row][p.col]==1)

{ printf("\n===============================================\n")

printf("此迷宫无解\n\n")X=0return 0}

maze[p.row][p.col]=2

enqueue(p)

while(!is_empty())

{p=dequeue()

if((p.row==m-1)&&(p.col==n-1)) break

if((p.col+1<n)&&(maze[p.row][p.col+1]==0)) visit(p.row,p.col+1,maze)

if((p.row+1<m)&&(maze[p.row+1][p.col]==0)) visit(p.row+1,p.col,maze)

if((p.col-1>=0)&&(maze[p.row][p.col-1]==0)) visit(p.row,p.col-1,maze)

if((p.row-1>=0)&&(maze[p.row-1][p.col]==0)) visit(p.row-1,p.col,maze)

}

if(p.row==m-1&&p.col==n-1)

{printf("\n==================================================================\n")

printf("迷宫路径为:\n")

printf("(%d,%d)\n",p.row,p.col)

maze[p.row][p.col]=3

while(p.predecessor!=-1)

{p=queue[p.predecessor]

printf("(%d,%d)\n",p.row,p.col)

maze[p.row][p.col]=3

}

}

else {printf("\n=============================================================\n")

printf("此迷宫无解!\n\n")X=0}

return 0

}

int main()

{int i,m,n,cycle=0

while(cycle!=(-1))

{

printf("********************************************************************************\n")

printf(" ☆欢迎进入迷宫求解系统☆\n")

printf(" 设计者:尹旭 林静波(信息2班)\n")

printf("********************************************************************************\n")

printf(" 手动生成迷宫 请按:1\n")

printf(" 自动生成迷宫 请按:2\n")

printf(" 退出 请按:3\n\n")

printf("********************************************************************************\n")

printf("\n")

printf("请选择你的 *** 作:\n")

scanf("%d",&i)

switch(i)

{case 1:printf("\n请输入行数:")

scanf("%d",&m)

printf("\n")

printf("请输入列数:")

scanf("%d",&n)

while((m<=0||m>50)||(n<=0||n>50))

{ printf("\n抱歉,你输入的行列数超出预设范围(0-50,0-50),请重新输入:\n\n")

printf("请输入行数:")

scanf("%d",&m)

printf("\n")

printf("请输入列数:")

scanf("%d",&n)

}

shoudong_maze(m,n)

print_maze(m,n)

mgpath(maze,m,n)

if(X!=0)

result_maze(m,n)

printf("\n\nPress Enter Contiue!\n")

getchar()

while(getchar()!='\n')

break

case 2:printf("\n请输入行数:")

scanf("%d",&m)

printf("\n")

printf("请输入列数:")

scanf("%d",&n)

while((m<=0||m>50)||(n<=0||n>50))

{printf("\n抱歉,你输入的行列数超出预设范围(0-50,0-50),请重新输入:\n\n")

printf("请输入行数:")

scanf("%d",&m)

printf("\n")

printf("请输入列数:")

scanf("%d",&n)

}

zidong_maze(m,n)

print_maze(m,n)

mgpath(maze,m,n)

if(X!=0)

result_maze(m,n)

printf("\n\nPress Enter Contiue!\n")getchar()while(getchar()!='\n')break

case 3:cycle=(-1)

break

default:printf("\n")

printf("你的输入有误!\n")

printf("\nPress Enter Contiue!\n")

getchar()

while(getchar()!='\n')break

}

}

}

递归的话就是深度优先搜索(可以理解成不撞南墙不回头,撞了墙就原路返回)可以加上剪枝(就是做标记,如果之前某一次走过但不通的路下次再走到就不用走了)

用栈的话应该是广度优先搜索(大概就是分裂无数个你,每次向所有方向走一步),不过广搜要用队列实现,用栈本质还是深搜了

具体算法可以搜百度


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11409898.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存