
nothing special
具体详见我的GitHub: >
#include <stdioh>
#include <stdlibh>
#include <timeh>
/迷宫的数组/
int maze[100][100];
/迷宫的行数和列数/
int m=7,n=7;
/
对迷宫进行初始化,用随机数产生迷宫
/
void InitMaze()
{
int i,j,temp;
srand((unsigned)time(NULL));
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
temp=rand()%100;
if(temp>30)
{
maze[i-1][j-1]=0;
}else
{
maze[i-1][j-1]=1;
}
}
maze[0][0]=0;
maze[m-1][n-1]=9;
}
/
定义栈和栈的节点
/
typedef struct Node
{
int x;
int y;
struct Node next;
}Node,Stack;
/
初始化Stack
/
void InitStack(Node Stack)
{
Stack=(Node )malloc(sizeof(Node));
if(Stack==NULL)
{
printf("分配空间失败\n");
exit(0);
}else
{
Stack->next=NULL;
}
}
/
压栈
/
void push(Node Stack,int x,int y)
{
Node temp;
temp=(Node )malloc(sizeof(Node));
if (!temp)
{
printf("分配内存空间错误");
return;
}
else
{
temp->x=x;
temp->y=y;
temp->next=Stack->next;
Stack->next=temp;
}
}
/
出栈
/
void pop(Node Stack,int x,int y)
{
Node temp;
temp=Stack->next;
if(!temp){
return;
}else{
x=temp->x;
y=temp->y;
}
Stack->next=temp->next;
free(temp);
}
/
判断栈是否为空
/
int isEmpty(Node Stasck)
{
return ((Stasck->next)==NULL);
}
/
判断从该点时候可以向其他方向移动,并返回移动的方向
/
int pass(int i,int j)
{
/右方向/
if(j<n-1&&(maze[i][j+1]==0||maze[i][j+1]==9))
{
return 2;
}
/下方向/
if(i<m-1&&(maze[i+1][j]==0||maze[i+1][j]==9))
{
return 3;
}
/左方向/
if(j>=1&&(maze[i][j-1]==0||maze[i][j-1]==9))
{
return 4;
}
/上方向/
if(i>=1&&(maze[i-1][j]==0||maze[i-1][j]==9))
{
return 5;
}
return -1;
}
/
对迷宫进行打印
/
void printMaze()
{
int i=0,j=0;
printf(" ");
for(i=0;i<n;i++)
{
if(i+1>9)
printf("%d ",i+1);
else
printf(" %d",i+1);
}
printf("\n");
for(i=0;i<m;i++){
if(i+1>9)
printf("%d",i+1);
else
printf(" %d",i+1);
for(j=0;j<n;j++)
{
if(maze[i][j]==0||maze[i][j]==9||maze[i][j]==-1)
{
printf("a ");
}
else if(maze[i][j]==1)
{
printf("b ");
}else
if(maze[i][j]==2)
{
printf("D ");
}else if(maze[i][j]==3)
{
printf("X ");
}else if(maze[i][j]==4)
{
printf("A ");
}else if(maze[i][j]==5)
{
printf("W ");
}
}
printf("\n");
}
}
/
对迷宫进行路径搜索
数组的数字有以下含义
0该点没有被探索过,且可行
1该点不可行
2该点是可行的,且进行了向东的探索
3该点是可行的,且进行了向南的探索
4该点是可行的,且进行了向西的探索
5该点是可行的,且进行了向北的探索
6该点是入口
9该点是出口
-1该点已经遍历完毕四个方向,不能找到有效的路径,则置为-1
/
void FindPath()
{
int curx=0,cury=0;
int count=0;
int flag=0;
Node Stacks=NULL;
InitStack(Stacks);
do{
if(maze[curx][cury]==9)
{
flag=1;
}
switch(pass(curx,cury)){
case 2:
maze[curx][cury]=2;
push(Stacks,curx,cury);
cury++;
break;
case 3:
maze[curx][cury]=3;
push(Stacks,curx,cury);
curx++;
break;
case 4:
maze[curx][cury]=4;
push(Stacks,curx,cury);
cury--;
break;
case 5:
maze[curx][cury]=5;
push(Stacks,curx,cury);
curx--;
break;
case -1:
maze[curx][cury]=-1;
if(!isEmpty(Stacks))
pop(Stacks,&curx,&cury);
break;
}
count++;
}while(!isEmpty(Stacks)&&flag==0);
if(flag==1)
{
printf("该迷宫的行走路径如下:\n");
printMaze();
}else
{
printf("\nSorry,该迷宫无解\n");
}
}
/
主函数
要求输入m,n的值,要符合要求
程序打印出生成的迷宫,然后进行寻找路径
如果可以找到出口,则画出该路径
如果该迷宫没有出口,则提示迷宫无解
/
int main()
{
/printf("请输入迷宫的行数m(大于0,小于100):");
scanf("%d",&m);
printf("请输入迷宫的列数n(大于0,小于100):");
scanf("%d",&n);
if(m<0||m>100||n<0||n>100){
printf("输入数据错误,程序退出\n");
exit(-1);
}/
InitMaze();
printf("原迷宫为:\n");
printMaze();
FindPath();
getch();
return 0;
}
#include<stdioh>
#include<stdlibh>
#define M 15
#define N 15
struct mark //定义迷宫内点的坐标类型
{
int x;
int y;
};
struct Element //"恋"栈元素,嘿嘿。。
{
int x,y; //x行,y列
int d; //d下一步的方向
};
typedef struct LStack //链栈
{
Element elem;
struct LStack next;
}PLStack;
/栈函数/
int InitStack(PLStack &S)//构造空栈
{
S=NULL;
return 1;
}
int StackEmpty(PLStack S)//判断栈是否为空
{
if(S==NULL)
return 1;
else
return 0;
}
int Push(PLStack &S, Element e)//压入新数据元素
{
PLStack p;
p=(PLStack)malloc(sizeof(LStack));
p->elem=e;
p->next=S;
S=p;
return 1;
}
int Pop(PLStack &S,Element &e) //栈顶元素出栈
{
PLStack p;
if(!StackEmpty(S))
{
e=S->elem;
p=S;
S=S->next;
free(p);
return 1;
}
else
return 0;
}
/求迷宫路径函数/
void MazePath(struct mark start,struct mark end,int maze[M][N],int diradd[4][2])
{
int i,j,d;int a,b;
Element elem,e;
PLStack S1, S2;
InitStack(S1);
InitStack(S2);
maze[startx][starty]=2; //入口点作上标记
elemx=startx;
elemy=starty;
elemd=-1; //开始为-1
Push(S1,elem);
while(!StackEmpty(S1)) //栈不为空 有路径可走
{
Pop(S1,elem);
i=elemx;
j=elemy;
d=elemd+1; //下一个方向
while(d<4) //试探东南西北各个方向
{
a=i+diradd[d][0];
b=j+diradd[d][1];
if(a==endx && b==endy && maze[a][b]==0) //如果到了出口
{
elemx=i;
elemy=j;
elemd=d;
Push(S1,elem);
elemx=a;
elemy=b;
elemd=886; //方向输出为-1 判断是否到了出口
Push(S1,elem);
printf("\n0=东 1=南 2=西 3=北 886为则走出迷宫\n\n通路为:(行坐标,列坐标,方向)\n");
while(S1) //逆置序列 并输出迷宫路径序列
{
Pop(S1,e);
Push(S2,e);
}
while(S2)
{
Pop(S2,e);
printf("-->(%d,%d,%d)",ex,ey,ed);
}
return; //跳出两层循环,本来用break,但发现出错,exit又会结束程序,选用return还是不错滴
}
if(maze[a][b]==0) //找到可以前进的非出口的点
{
maze[a][b]=2; //标记走过此点
elemx=i;
elemy=j;
elemd=d;
Push(S1,elem); //当前位置入栈
i=a; //下一点转化为当前点
j=b;
d=-1;
}
d++;
}
}
printf("没有找到可以走出此迷宫的路径\n");
}
/建立迷宫/
void initmaze(int maze[M][N])
{
int i,j;
int m,n; //迷宫行,列 [/M]
printf("请输入迷宫的行数 m=");
scanf("%d",&m);
printf("请输入迷宫的列数 n=");
scanf("%d",&n);
printf("\n请输入迷宫的各行各列:\n用空格隔开,0代表路,1代表墙\n",m,n);
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
scanf("%d",&maze[i][j]);
printf("你建立的迷宫为(最外圈为强)\n");
for(i=0;i<=m+1;i++) //加一圈围墙
{
maze[i][0]=1;
maze[i][n+1]=1;
}
for(j=0;j<=n+1;j++)
{
maze[0][j]=1;
maze[m+1][j]=1;
}
for(i=0;i<=m+1;i++) //输出迷宫
{
for(j=0;j<=n+1;j++)
printf("%d ",maze[i][j]);
printf("\n");
}
}
void main()
{
int sto[M][N];
struct mark start,end; //start,end入口和出口的坐标
int add[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//行增量和列增量 方向依次为东西南北 [/M]
initmaze(sto);//建立迷宫
printf("输入入口的横坐标,纵坐标[逗号隔开]\n");
scanf("%d,%d",&startx,&starty);
printf("输入出口的横坐标,纵坐标[逗号隔开]\n");
scanf("%d,%d",&endx,&endy);
MazePath(start,end,sto,add); //find path
system("PAUSE");
}
以上就是关于cs61b实验记录(三)project 2 prim迷宫随机生成算法全部的内容,包括:cs61b实验记录(三)project 2 prim迷宫随机生成算法、C++编程问题:编一个迷宫游戏程序、程序设计 老鼠走迷宫等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)