cs61b实验记录(三)project 2 prim迷宫随机生成算法

cs61b实验记录(三)project 2 prim迷宫随机生成算法,第1张

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++编程问题:编一个迷宫游戏程序、程序设计 老鼠走迷宫等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9759374.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存