Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >纯c语言迷宫源码

纯c语言迷宫源码

原创
作者头像
C语言与CPP编程
修改于 2021-01-04 02:34:08
修改于 2021-01-04 02:34:08
3.1K00
代码可运行
举报
文章被收录于专栏:c语言与cpp编程c语言与cpp编程
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 来自公众号:c语言与cpp编程

/*迷宫的数组*/
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;
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
迷宫问题的通用解法C语言数据结构实现
以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
里克贝斯
2021/05/21
2K0
走迷宫(bfs, 最短路)
Input 10 10 #S######.# ......#..# .#.##.##.# .#........ ##.##.#### ....#....# .#######.# ....#..... .####.###. ....#...G# ---- Output 22 ---- 代码: #include<iostream> #include<cstring> #include<queue> using namespace std; typedef pair<int, int> P; queue<P> p
_DIY
2019/09/11
8290
走迷宫(bfs, 最短路)
【算法】老鼠走迷宫
老鼠走迷官(一) 说明老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表 示老鼠的行走路径,试以程式求出由入口至出口的路径。 解法老鼠的走法有上、左、下、右四个方向,在每前进一格之后就选一个方向前进,无法前 进时退回选择下一个可前进方向,如此在阵列中依序测试四个方向,直到走到出口为止,这是 递回的基本题,请直接看程式应就可以理解。 #include <stdio.h> #include <stdlib.h> int visit(int, int); int maze[7][7]
赵腰静
2018/03/09
1.3K0
迷宫算法(DFS)
1.如果采用堆栈进行迷宫探测,则称之为深度优先搜索(DFS),它和递归的探测思路是基本一致的,可以看成是递归方式的非递归版本;
大忽悠爱学习
2021/03/08
4K0
Fire! UVA - 11624 (两步bfs)
两步bfs,先出火到达各地时的时间(设初始时间为0,人每走一步为1s,在着一步内火可以向四周可触及的方向同时扩散),然后在bfs人,人能在某地当且仅当所到时间小于火到达时间
_DIY
2019/09/11
4460
迷宫问题的简单栈实现
以一个n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍,设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
glm233
2020/09/28
7130
迷宫问题(maze problem)——深度优先(DFS)与广度优先搜索(BFS)求解
给定一个迷宫,指明起点和终点,找出从起点出发到终点的有效可行路径,就是迷宫问题(maze problem)。
恋喵大鲤鱼
2018/08/03
13.8K1
迷宫问题(maze problem)——深度优先(DFS)与广度优先搜索(BFS)求解
迷宫问题(bfs的应用)
问题描述: 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示:  int maze[5][5] = {         0, 1, 0, 0, 0,         0, 1, 0, 1, 0,         0, 0, 0, 0, 0,         0, 1, 1, 1, 0,         0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点
用户1215536
2018/02/05
7170
一天一大 leet(寻宝)难度:困难-Day20200729
在地图上有若干个机关点(用 'M' 表示),只有所有机关均被触发,才可以拿到宝藏。
前端小书童
2020/09/24
5730
一天一大 leet(寻宝)难度:困难-Day20200729
C语言经典例题100
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
C语言与CPP编程
2021/04/02
2.9K0
C语言经典例题100
简易计算器
C++简易计算器栈栈(Stack)的特点栈的相关概念栈的常用操作为栈的常见分类实例计算器概念代码实现测试
DeROy
2020/06/03
1.4K0
简易计算器
C语言迷宫代码分享
#include<stdio.h> #include<stdbool.h> #include <malloc.h> #define M 8 #define N 8 #define maxsize 100 int mg[M+2][N+2]= { {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},//0 {1, 0, 0, 1, 0, 0, 0, 1, 0, 1},//1 {1, 0, 0, 1, 0, 0, 0, 1, 0, 1},//2 {1, 0, 0, 0, 0, 1, 1, 0, 0, 1
神无月
2018/06/26
4.2K0
c语言游戏小型程序代码,C语言小游戏源码「建议收藏」
if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)
全栈程序员站长
2022/08/30
9.1K0
算法:堆栈与深度优先搜索(迷宫问题)
堆栈的访问规则被限制为Push和Pop两种操作,Push(入栈或压栈)向栈顶添加元素,Pop(出栈或弹出)则取出当前栈顶的元素,也就是说,只能访问栈顶元素而不能访问栈中其它元素。 现在我们用堆栈解决一
s1mba
2018/01/03
1.4K0
算法:堆栈与深度优先搜索(迷宫问题)
C语言入门经典题目及其答案
【程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 2.程序源代码:
风骨散人Chiam
2020/10/28
2.9K0
每日一题 C++版(走迷宫)
编程是很多偏计算机、人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用。因此小白决定开辟一个新的板块“每日一题”,通过每天一道编程题目来强化和锻炼自己的编程能力(最起码不会忘记编程)
小白学视觉
2019/10/24
1.7K0
HDU 1026 Ignatius and the Princess I 迷宫范围内的搜索剪枝问题
没什么解决问题的分析报告,不指出其中的关键点。代码更像是一大抄。一些分析师也有很大的文章分析。只是不要全部命中关键,什么是广泛而深刻的,甚至搜索发现,在分析差异。为什么快速搜索宽像,什么样的风暴喊搜索,都错了。代码都是抄过的。
全栈程序员站长
2022/07/06
5420
数据结构:C语言 走迷宫---栈/队列实现
走矩阵迷宫,0代表可以走,1代表障碍物 栈实现: #include <stdio.h> #define MAX_ROW 5 #define MAX_COL 5 struct point { int row; int col; }; struct point stack[512]; int top = 0; void push(struct point p) { stack[top++] = p; } struct point pop(void) { return stack[-
Gabriel
2022/11/15
9980
Data Structure_Visualization排序可视化走迷宫生成迷宫扫雷
选择排序很简单,遍历所有元素,查看一下他们的之后最小的元素和当前元素交换即可。模板函数使用上面的swing模板。为了更清楚显示出排序的过程,可以用不同颜色代表排好序和未排好序的。
西红柿炒鸡蛋
2018/12/28
9940
Java-栈方法实现迷宫问题
迷宫m行n列maze[m][n],0表示通,1表示不通。从一个点可以向8个方向探路,为了处理边角情况,迷宫的四周全部加一行一列,最后为maze[m+2][n+2]。
leehao
2025/02/11
730
相关推荐
迷宫问题的通用解法C语言数据结构实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验