迷宫问题的通用解法C语言数据结构实现
来源:互联网 发布:红旗沟惨案知乎 编辑:程序博客网 时间:2024/05/21 17:21
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!"); else printf("ERROR!");}
递归代码:
#include <stdio.h>#include <malloc.h>#define M 6#define N 6#define END N-2int 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 50typedef 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; //开始为0 S1=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; }//if if(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);}
阅读全文
0 0
- 迷宫问题的通用解法C语言数据结构实现
- 迷宫问题C语言解法
- 迷宫问题C语言实现
- 迷宫问题--C语言实现
- [算法]数据结构算法背包问题解法之递归解法,C语言实现
- 数据结构 C语言 队列 迷宫问题
- C语言实现通用数据结构的高效设计
- 迷宫的实现--c语言
- [算法]简单的背包问题递归解法,C语言实现
- 用C语言实现迷宫求解问题
- 迷宫问题 C语言实现(深搜)
- c语言实现通用数据结构(一):通用链表
- c语言实现通用数据结构(二):通用队列
- c语言实现通用数据结构(三):通用椎栈
- c语言实现通用数据结构:通用映射(HashMap)
- c语言实现通用数据结构(一):通用链表
- c语言实现通用数据结构:通用集合(HashSet)
- 数据结构 C语言 双向链栈 迷宫问题
- Git简明教程
- javascript url 字符串编码加密
- 5、《Jmeter基础篇》 从此善用逻辑控制器(3)
- (项目)报错:Injection of autowired dependencies failed;依赖注入失败
- Jquery中 使用Ajax获取Json 数据
- 迷宫问题的通用解法C语言数据结构实现
- java基本数据类型转换
- C++中的类型重定义
- Jlink&STlink工具烧录读取hex&bin
- 从现在开始学习Nginx——1.基础知识
- 在dll里面申请内存, 主程序释放导致AV
- Kotlin-09.类属性和字段(Properties/Fields)
- math.random()的用法
- (检出冲突)svn项目与本地的项目冲突,当close掉检出的项目时,原有的项目就会全部报错