1.1问题描述
以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

1.2基本要求
输入的形式和范围:
非递归:行列为整型,坐标为整型

递归:迷宫以整型二维数组形式输入

输出的形式:非递归输出三元组通路和方阵通路;
递归以方阵输出迷宫和所有通路;

1、非递归算法,求一条通路输出三元组形式如:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…和方阵通路;

2、递归算法,求得迷宫中所有可能的通路,以方阵形式输出迷宫及其通路。

大家先看一个特例:(特例结束后给处通用代码:代码转自AHU15计算机科学与技术专业赵吴攀先生,在此鸣谢)

#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;typedef struct{int ord;int flag;int i;int j;
}SElemType;
void di(int &t,int &i,int &j)
{if(t==1){j=j+1;}if(t==2){i=i+1;}if(t==3){j=j-1;}if(t==4){i=i-1;}}
void ri(int &t,int &m,int &n,int i,int j)
{if(t==1){n=j+1;}if(t==2){m=i+1;}if(t==3){n=j-1;}if(t==4){m=i-1;}}
int main()
{int maze[10][10]={{1,1,2,3,4,5,6,7,8,9},{1,0,0,1,0,0,0,1,0,1},{2,0,0,1,0,0,0,1,0,1},{3,0,0,0,0,1,1,0,0,1},{4,0,1,1,1,0,0,0,0,1},{5,0,0,0,1,0,0,0,0,1},{6,0,1,0,0,0,1,0,0,1},{7,0,1,1,1,0,1,1,0,1},{8,1,0,0,0,0,0,0,0,1},{9,1,1,1,1,1,1,1,1,1}};int curstep=1,m=1,n=1;int tag=0;SElemType e;e.flag=1;e.i=1,e.j=1;stack<SElemType>S;do{if(maze[m][n]<=0){maze[m][n]=1;e.ord=curstep;e.i=m;e.j=n;e.flag=1;S.push(e);if(m==8&&n==8){tag=1;break;}else{di(e.flag,m,n);printf("%d %d\n",m,n);curstep++;}}else{if(!S.empty()){e=S.top();S.pop();while(e.flag==4&&!S.empty()){maze[m][n]=1;e=S.top();S.pop();}if(e.flag<4){e.flag++;S.push(e);ri(e.flag,m,n,e.i,e.j);}}}}while(!S.empty());if(tag==1)printf("SUCCESS!");elseprintf("ERROR!");}

递归代码:

#include <stdio.h>
#include <malloc.h>
#define M 6
#define N 6
#define END N-2
int flag=0;
typedef struct
{int x,y,d;
}position;/*创建迷宫*/
void creat_maze(int a[][M])
{int i,j;for(i=0;i<=N-1;i++)for(j=0;j<=M-1;j++)scanf("%1d",&a[i][j]);
}position nextq(int maze[][M],position q)
{if(q.d==0)q.y++;else if(q.d==1)q.x++;else if(q.d==2)q.y--;else if(q.d==3)q.x--;return q;
}
void initialmat(int route[][M])       //初始化输出路径图
{int i,j;for(i=0;i<N;i++)for(j=0;j<M;j++)route[i][j]=1;
}
void print_maze(int mat[][M])        //输出迷宫
{int i,j;for(i=0;i<N;i++){for(j=0;j<M;j++)printf("%d ",mat[i][j]);printf("\n");}}
void MazePath(int maze[][M],int route[][M],position ps)
{position q;route[ps.x][ps.y]=0;maze[ps.x][ps.y]=-1;q=nextq(maze,ps);q.d=0;if(q.x==END&&q.y==END){flag++;printf("\n第%d条路:\n",flag);route[END][END]=0;print_maze(route);route[END][END]=1;}else if(maze[q.x][q.y]==0)MazePath(maze,route,q);if(ps.d<=3){ps.d++;MazePath(maze,route,ps);}route[ps.x][ps.y]=1;maze[ps.x][ps.y]=0;
}
void main()
{int maze[N][M],route[N][M];position ps;ps.x=ps.y=1;ps.d=0;printf("输入一个迷宫(%d*%d):\n",N,M);creat_maze(maze);printf("\n输出该迷宫:\n");print_maze(maze);printf("输出从(1,1)到(%d,%d)的所有通路:\n",N-2,M-2);initialmat(route);MazePath(maze,route,ps);
}

非递归代码:

#include<stdio.h>
#include<stdlib.h>
#define Elemtype int
#define MAXSIZE 50
typedef struct
{int x,y;
}mark;               //起点、终点坐标typedef struct
{Elemtype x,y;    //迷宫数组坐标(x,y)int d;    //下一步的方向
}TriMatrix;typedef struct LStackNode
{TriMatrix elem;struct LStackNode *next;
}LStack,*PLStack;//栈的基本操作PLStack InitStack(PLStack S)
{S=NULL;return S;
}int StackEmpty(PLStack S)
{if(S==NULL)  return 1;else return 0;
}PLStack Push(PLStack S,TriMatrix e)   //入栈
{PLStack P;P=(PLStack)malloc(sizeof(LStack));P->elem=e;P->next=S;S=P;return S;
}PLStack Delete(PLStack S)   //删除栈头
{PLStack P;P=S;if(!StackEmpty(S)){S=S->next;free(P);return S;}
}TriMatrix Pop(PLStack S,TriMatrix e)  //出栈
{if(!StackEmpty(S)){e=S->elem;return e;}
}void MazePath(mark start,mark end,Elemtype maze[MAXSIZE][MAXSIZE],int m,int n,int diradd[4][2])   //寻找路径
{int i,j,d;int a,b;TriMatrix elem,e;PLStack S1,S2;S1=InitStack(S1);S2=InitStack(S2);maze[start.x][start.y]=2;   //修改入口坐标,做标记elem.x=start.x;elem.y=start.y;elem.d=0;  //开始为0S1=Push(S1,elem);while(!StackEmpty(S1))  //栈不空,有路可走{elem=Pop(S1,elem);S1=Delete(S1);i=elem.x;j=elem.y;d=elem.d+1;while(d<=4){a=i+diradd[d-1][0];b=j+diradd[d-1][1];if(a==end.x&&b==end.y&&maze[a][b]==0)  //出口{elem.x=i;elem.y=j;elem.d=d;S1=Push(S1,elem);elem.x=a;elem.y=b;elem.d=0;   //方向输出为0,判断是否为出口S1=Push(S1,elem);printf("\n1=东 2=南 3=西 4=北 0为走出迷宫\n\n路径为:(行坐标,列坐标,方向)\n");while(S1)  //逆置序列 并输出路径{e=Pop(S1,e);S1=Delete(S1);S2=Push(S2,e);}while(S2){e=Pop(S2,e);S2=Delete(S2);printf("-->(%d,%d,%d)",e.x,e.y,e.d);maze[e.x][e.y]=3;}printf("\n\n");for(i=0;i<=m+1;i++){for(j=0;j<=n+1;j++)if(maze[i][j]==3) printf("0 ");else printf("1 ");printf("\n");}return;}//ifif(maze[a][b]==0){maze[a][b]=2;elem.x=i;elem.y=j;elem.d=d;S1=Push(S1,elem);i=a;  j=b;  d=0;}d++;}}printf("没有出迷宫的路径\n");
}//建立迷宫
void initmaze(int maze[MAXSIZE][MAXSIZE],int m,int n)
{int i,j;for(i=1;i<=m;i++)for(j=1;j<=n;j++)maze[i][j]=rand()%2;for(i=0;i<=m+1;i++){maze[i][0]=maze[i][n+1]=1;}for(j=0;j<=n+1;j++){maze[0][j]=maze[m+1][j]=1;}printf("输出迷宫:\n");for(i=0;i<=m+1;i++){for(j=0;j<=n+1;j++)printf("%d ",maze[i][j]);printf("\n");}
}void main()
{int maze[MAXSIZE][MAXSIZE];mark start,end;int m,n;  //迷宫行列printf("输入迷宫的行数m和列数n:\n");scanf("%d%d",&m,&n);int add[4][2]={{0,1},{1,0},{0,-1},{-1,0}};initmaze(maze,m,n);printf("输入入口坐标和出口坐标:\n");scanf("%d%d%d%d",&start.x,&start.y,&end.x,&end.y);MazePath(start,end,maze,m,n,add);
}

迷宫问题的通用解法C语言数据结构实现相关推荐

  1. 迷宫的非递归求解 C语言 数据结构课程设计

    非递归求解迷宫问题 问题解决的实现 运行环境说明: 正常数据测试 有疑问看这里 源码及课程设计报告 更新一下以往的课程设计,希望能给相同课程设计的同学提供一个不一样的思路. 问题解决的实现 问题描述: ...

  2. Go语言-数据结构与算法

    go语言之专业数据结构与算法 3.golang实现数组结构 code\ArrayList\ArrayList.go package ArrayListimport ("errors" ...

  3. c语言将一个已知头结点的单链表逆序_C语言数据结构实现链表逆序并输出

    C语言数据结构实现链表逆序并输出 将一个链表逆序并输出.我用了两种方法来实现,第一种是借助了一个新的空链表:第二种是在原来链表的基础上直接实现逆序. 实例代码: 头文件: #include #incl ...

  4. 数据结构c语言版第一章答案,《c语言数据结构》第一章概论自测题答案

    <<c语言数据结构>第一章概论自测题答案>由会员分享,可在线阅读,更多相关<<c语言数据结构>第一章概论自测题答案(4页珍藏版)>请在人人文库网上搜索. ...

  5. 微软亚研提出VL-BERT:通用的视觉-语言预训练模型

    机器之心发布 作者:Weijie Su.Xizhou Zhu.Yue Cao.Bin Li.Lewei Lu.Furu Wei.Jifeng Dai 来自中科大.微软亚研院的研究者们提出了一种新型的通 ...

  6. 一些可运行的C语言数据结构代码

    网上有很多C语言数据结构代码:有的不能运行:下面是一些能运行的,和运行截图:备用一下: 1 队列 #include<stdio.h> #include<stdlib.h>#de ...

  7. C语言数据结构学习用单元测试

    药物名称: C语言数据结构学习用单元测试 主治: 本品是基于CUnit编写的.全部的.纯C的数据结构(ADT)各种实现的单元测试.主治基础不牢,水品增长缓慢.建议配合严蔚敏<数据结构>(C ...

  8. C语言:一种通用的程序设计语言

    点击上方蓝字关注我,了解更多咨询 语言是一种通用的程序设计语言.它同UNIX系统之间具有非常密切的关系.C语言是在UNIX系统上开发的,且无论是UNIX系统本身还是其上运行的大部分程序,都是C语言编写 ...

  9. 顺序表输入栈元素c语言,C语言数据结构之栈简单操作

    C语言数据结构之栈简单操作 实验: 编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能: (1)初始化顺序栈 (2)插入元素 (3)删除栈顶元素 (4)取栈顶元素 (5)遍 ...

  10. 用数据结构c语言写成绩排序,C语言数据结构 快速排序实例详解

    C语言数据结构 快速排序实例详解 一.快速排序简介 快速排序采用分治的思想,第一趟先将一串数字分为两部分,第一部分的数值都比第二部分要小,然后按照这种方法,依次对两边的数据进行排序. 二.代码实现 # ...

最新文章

  1. spring4声明式事务--01注解方式
  2. C语言高级编程:sizeof计算数组大小需要注意的问题
  3. IP地址分类及ISO-OSI、三次握手
  4. 两个苹果手机如何同步数据_同步苹果手机和Windows的提醒事项
  5. python 目录 文件名_python目录与文件名操作
  6. Android5.1--电源管理之省电模式分析
  7. Landsat 数据下载与预处理
  8. Caffe傻瓜系列(4):其它常用层及参数
  9. python编程语言图解_Python程序运行原理图文解析
  10. Java小白入门:聊聊Java这门编程语言
  11. LaTeX 2022 安装教程
  12. CSI-RS资源配置
  13. jsf服务_JSF ManagedBean ManagedProperty
  14. A股明日风口:央行工作会议要求推进法定数字货币研发
  15. Apsara Clouder云计算专项技能认证:云服务器ECS入门[考试真题]
  16. primocache学生党常用场景设置
  17. 从红队视角看AWD攻击
  18. 北京物资学院计算机考研资料汇总
  19. 1602实现计算机实验报告,LCD1602液晶显示实验报告
  20. bom成本分析模型_用BOM表算成本的大致思路是什么?

热门文章

  1. C3P0组件+DbUtils组件实现一个JdbcUtils工具类
  2. linux 网卡 虚拟化,RHEL6.4 KVM虚拟化网卡桥接,PXE无人值守安装虚拟机
  3. mysql 添加实例_如何在多实例基础上再添加一个mysql的实例
  4. C#:DataTable查询结果判断某一列为空
  5. loading怎么关闭 vant_Vant Loading 加载
  6. FNV摘要HASH算法实战
  7. swagger2.2.2报错:relProviderPluginRegistry,linkDiscovererRegistry,entityLinksPluginRegistry
  8. ORB_SLAM3_一张图说明ORB-SLAM中的ORB特征提取和图像匹配算法流程
  9. 递归算法计算八皇后问题(Eight Queen Problem with Recursive Algorithm)
  10. 编译caffe错误查询