#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* 【自学去】网站收集 http://www.zixue7.com */
/*迷宫的数组*/
int maze[100][100];
/*迷宫的行数和列数*/
int m=0,n=0;
/*
*对迷宫进行初始化,用随机数产生迷宫
*/
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 drawMaze()
{
int i=0,j=0;
for(i=0;i<m;i++){
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 ShowPath()
{
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("The path is :\n");
printf("\n");
drawMaze();
}else
{
printf("\nSorry,you fail\n");
}
}
/*
*主函数
*/
int main()
{
loop:
printf("plase input the number of row m(m>0,m<100):");
scanf("%d",&m);
printf("plase input the number of line n(n>0,n<100):");
scanf("%d",&n);
if(m<0||m>100||n<0||n>100){
printf("The number is error,process will exit !\n");
exit(-1);
}
printf("The character is 'a',it is area.\n");
printf("The character is 'b',it is wall.\n");
printf("\n");
InitMaze();
printf("The oid Maze:\n");
printf("\n");
drawMaze();
printf("\n show the path ?(y/n)");
fflush(stdin);
if(toupper(getch())=='Y')
{
printf("\n");
ShowPath();
printf("\n go on play ?(y/n)");
fflush(stdin);
if(toupper(getch())=='Y')
{
goto loop;
}
else
{
exit(1);
}
}
else
{
exit(1);
}
getch();
return 0;
}
c语言纯c语言迷宫源码程序设计
需积分: 1 159 浏览量
2024-03-18
14:12:46
上传
评论
收藏 56KB ZIP 举报
清水白石008
- 粉丝: 2700
- 资源: 631
最新资源
- IMG_0694.GIF
- 基于图像的三维模型重建C++源代码+文档说明(高分课程设计)
- 基于聚焦法的工件立体测量方案,根据数据进行三维重建 使用HALCON处理图像,MATLAB拟合数据+源代码+数据集+效果图
- 锄战三国村 修改:货币使用不减 v1.10(2) 原创 (中文).apk
- 基于python实现的单目双目视觉三维重建+源代码+图像图片(高分课程设计)
- 基于C+++OPENCV的全景图像拼接源码(课程设计)
- 基于Python+OpenCV对多张图片进行全景图像拼接,消除鬼影,消除裂缝+源代码+文档说明+界面截图(高分课程设计)
- 基于C++实现的全景图像拼接源码(课程设计)
- 基于SIFT特征点提取和RASIC算法实现全景图像拼接python源码+文档说明+界面截图+详细注释(95分以上课程大作业)
- 基于matlab实现眼部判别的疲劳检测系统+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈