数据结构迷宫问题求解.docx
《数据结构迷宫问题求解.docx》由会员分享,可在线阅读,更多相关《数据结构迷宫问题求解.docx(12页珍藏版)》请在冰豆网上搜索。
数据结构迷宫问题求解
学号专业计算机科学与技术姓名
实验日期2017.6.20教师签字成绩
实验报告
【实验名称】迷宫问题的求解
【实验目的】
(1)通过本课程的学习,能熟练掌握几种基本数据结构的基本操作。
(2)能针对给定题目,选择相应的数据结构,分析并设计算法,进而给出问题的正确求解过程并编写代码实现。
(3)用递归和非递归两种方式完成迷宫问题的求解。
【实验原理】
迷宫问题通常是用“穷举求解”方法解决,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前走;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。
假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。
栈是一个后进先出的结构,可以用来保存从入口到当前位置的路径。
【实验内容】
1需求分析
1.基本要求:
(1)首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。
求得的通路以三元组(i,j,d)的形式输出。
其中:
(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。
如,对于教材第50页图3.4所示的迷宫,输出一条通路为:
(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…
(2)编写递归形式的算法,求得迷宫中所有可能的通路。
(3)以方阵形式输出迷宫及其通路。
(4)按照题意要求独立进行设计,设计结束后按要求写出设计报告。
2.输入输出的要求:
(i)求得的通路以三元组(i,j,d)的形式输出,其中:
(i,j)指示迷宫中的一个坐标,d表示走到下一个坐标的方向。
(ii)输出迷宫示意图
3.程序所能达到的功能:
(i)实现一个以链表作存储结构的栈类型,以非递归算法求出通路
(ii)以一个递归算法,对任意输入的迷宫矩阵求出所有通路。
2概要设计
1.①构建一个二维数组maze[M][N]用于存储迷宫矩阵
②手动生成迷宫,即为二维数组maze[M][N]赋值
③构建一个栈用于存储迷宫路径
④建立迷宫节点用于存储迷宫中每个节点的访问情况;
非递归
本程序包含6个函数:
(1)主函数main()
(2)生成迷宫create_maze()
(4)打印迷宫print_maze()
(5)搜索迷宫路径并用三元组输出路径mgpath()
(6)用图来输出路径print_tu();
递归
本程序包含3个函数:
(1)主函数main();
(2)打印迷宫printmaze();
(3)搜索迷宫路径pass(intx,inty);
3.详细设计
1.非递归
起点和终点的结构类型typedefstruct{
inth;
intl;
}T;
栈节点类型typedefstructcell{
introw;
intcol;
intdir;
}TCell;
1.生成迷宫
voidcreat_maze(inta,intb)
{定义i,j为循环变量
for(ifor(j输入maze[i][j]的值}2.打印迷宫voidprint_maze(intm,intn){用i,j循环变量,将maze[i][j]输出}3.搜索迷宫路径voidmazepath(intmaze[][],Ts,Te)//参数传递迷宫和起点与终点{TCellS[N1*N2];top=0;//建立栈S[top].row=s.h;S[top].col=s.l;S[top].dir=-1;//起点入栈while(top>=0)//判栈是否空{i,j为当前访问点的位置if(i,j是终点坐标)用循环输出栈里的元素;else将(i,j),即访问点入栈,然后向四周寻找是否有通路,若有通路,将原访问点标记(赋值-1),选一条通路作为新访问点,入栈。若没有通路,回溯,将栈顶元素出栈作为访问点,继续寻找通路。}4.生成路线图Print_tu(){i,j为循环变量for(ifor(j{if(maze[i][j]==1);print(“#”)//#表示墙elseif(maze[i][j]==0)print(“”)elseprint(“+”)//+表示路径}2.递归voidprintmaze(){用i,j循环变量,将maze[i][j]输出}voidpass(intx,inty){将访问点标记maze[x][y]=-1;if(x,y是终点坐标)调用printmaze()输出栈里的元素;if(x,y的左边是通路)递归调用pass(x,y-1);if(x,y的右边是通路)递归调用pass(x,y+1);if(x,y的上边是通路)递归调用pass(x-1,y);if(x,y的下边是通路)递归调用pass(x+1,y);}4.测试与分析【小结或讨论】这次的项目,加强了我动手、思考和解决问题的能力。巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力培养了我查阅参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。附页源程序非递归#include#include#defineN110#defineN210intmaze[N1][N2];//迷宫数组typedefstruct{//起点终点坐标inth;intl;}T;typedefstructcell{introw;intcol;intdir;}TCell;//栈的元素结构TCellS[N1*N2];//栈voidcreat_maze(inta,intb)//建立迷宫{inti,j;for(i=0;ifor(j=0;jscanf("%d",&maze[i][j]);}voidprint_maze(inta,intb)//打印迷宫{inti,j;for(i=0;i{for(j=0;jprintf("%d",maze[i][j]);printf("\n");}}voidprint_tu(inta,intb)//打印迷宫路径图{inti,j;for(i=0;i{for(j=0;j{if(maze[i][j]==1)printf("#");elseif(maze[i][j]==0)printf("");elseprintf("+");}printf("\n");}}voidmazepath(intmaze[N1][N2],Ts,Te)//搜索路径{inttop=0;inti,j,k,find,di;S[top].row=s.h;S[top].col=s.l;S[top].dir=-1;maze[s.h][s.l]=-1;while(top>=0){i=S[top].row;j=S[top].col;di=S[top].dir;if(i==e.h&&j==e.l){printf("输出迷宫路径三元组:\n");for(k=0;k<=top;k++)printf("%d%d%d\n",S[k].row,S[k].col,S[k].dir);return;}find=0;while(find==0&&di<4){di++;switch(di){case0:{i=S[top].row-1;j=S[top].col;break;}case1:{i=S[top].row;j=S[top].col+1;break;}case2:{i=S[top].row+1;j=S[top].col;break;}case3:{i=S[top].row;j=S[top].col-1;break;}}if(maze[i][j]==0)find=1;}if(find==1){S[top].dir=di;top++;S[top].row=i;S[top].col=j;maze[i][j]=-1;}else{maze[S[top].row][S[top].col]=0;top--;}}printf("没有路径\n");}intmain()//主函数{inta,b;Ts,e;printf("输入迷宫的行数与列数:\n");scanf("%d,%d",&a,&b);printf("输入迷宫数据:\n");creat_maze(a,b);printf("输出迷宫:\n");print_maze(a,b);printf("输入起点与终点:\n");scanf("%d,%d",&s.h,&s.l);scanf("%d,%d",&e.h,&e.l);mazepath(maze,s,e);printf("输出迷宫图和路线:\n");print_tu(a,b);}递归#include#includeintmaze[9][9]={1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,0,0,1,0,0,1,1,0,1,0,1,0,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1};voidprintmaze(){inti,j;for(i=0;i<9;i++){for(j=0;j<9;j++){if(maze[i][j]==1)printf("#");elseif(maze[i][j]==-1)printf("+");elseprintf("");}printf("\n");}}voidpass(intx,inty){maze[x][y]=-1;if(x==7&&y==7){printf("输出路径\n");printmaze();}if(maze[x][y+1]==0)pass(x,y+1);if(maze[x+1][y]==0)pass(x+1,y);if(maze[x-1][y]==0)pass(x-1,y);if(maze[x][y-1]==0)pass(x,y-1);maze[x][y]=0;}intmain(){intinx=1,iny=1;printf("迷宫图是:\n");printmaze();pass(inx,iny);}
for(j
输入maze[i][j]的值
}
2.打印迷宫
voidprint_maze(intm,intn)
{
用i,j循环变量,将maze[i][j]输出
3.搜索迷宫路径
voidmazepath(intmaze[][],Ts,Te)//参数传递迷宫和起点与终点
TCellS[N1*N2];
top=0;//建立栈
S[top].row=s.h;
S[top].col=s.l;
S[top].dir=-1;//起点入栈
while(top>=0)//判栈是否空
{i,j为当前访问点的位置
if(i,j是终点坐标)
用循环输出栈里的元素;
else将(i,j),即访问点入栈,然后向四周寻找是否有通路,若有通路,将原访问点标记(赋值-1),选一条通路作为新访问点,入栈。
若没有通路,回溯,将栈顶元素出栈作为访问点,继续寻找通路。
4.生成路线图
Print_tu()
i,j为循环变量
for(ifor(j{if(maze[i][j]==1);print(“#”)//#表示墙elseif(maze[i][j]==0)print(“”)elseprint(“+”)//+表示路径}2.递归voidprintmaze(){用i,j循环变量,将maze[i][j]输出}voidpass(intx,inty){将访问点标记maze[x][y]=-1;if(x,y是终点坐标)调用printmaze()输出栈里的元素;if(x,y的左边是通路)递归调用pass(x,y-1);if(x,y的右边是通路)递归调用pass(x,y+1);if(x,y的上边是通路)递归调用pass(x-1,y);if(x,y的下边是通路)递归调用pass(x+1,y);}4.测试与分析【小结或讨论】这次的项目,加强了我动手、思考和解决问题的能力。巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力培养了我查阅参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。附页源程序非递归#include#include#defineN110#defineN210intmaze[N1][N2];//迷宫数组typedefstruct{//起点终点坐标inth;intl;}T;typedefstructcell{introw;intcol;intdir;}TCell;//栈的元素结构TCellS[N1*N2];//栈voidcreat_maze(inta,intb)//建立迷宫{inti,j;for(i=0;ifor(j=0;jscanf("%d",&maze[i][j]);}voidprint_maze(inta,intb)//打印迷宫{inti,j;for(i=0;i{for(j=0;jprintf("%d",maze[i][j]);printf("\n");}}voidprint_tu(inta,intb)//打印迷宫路径图{inti,j;for(i=0;i{for(j=0;j{if(maze[i][j]==1)printf("#");elseif(maze[i][j]==0)printf("");elseprintf("+");}printf("\n");}}voidmazepath(intmaze[N1][N2],Ts,Te)//搜索路径{inttop=0;inti,j,k,find,di;S[top].row=s.h;S[top].col=s.l;S[top].dir=-1;maze[s.h][s.l]=-1;while(top>=0){i=S[top].row;j=S[top].col;di=S[top].dir;if(i==e.h&&j==e.l){printf("输出迷宫路径三元组:\n");for(k=0;k<=top;k++)printf("%d%d%d\n",S[k].row,S[k].col,S[k].dir);return;}find=0;while(find==0&&di<4){di++;switch(di){case0:{i=S[top].row-1;j=S[top].col;break;}case1:{i=S[top].row;j=S[top].col+1;break;}case2:{i=S[top].row+1;j=S[top].col;break;}case3:{i=S[top].row;j=S[top].col-1;break;}}if(maze[i][j]==0)find=1;}if(find==1){S[top].dir=di;top++;S[top].row=i;S[top].col=j;maze[i][j]=-1;}else{maze[S[top].row][S[top].col]=0;top--;}}printf("没有路径\n");}intmain()//主函数{inta,b;Ts,e;printf("输入迷宫的行数与列数:\n");scanf("%d,%d",&a,&b);printf("输入迷宫数据:\n");creat_maze(a,b);printf("输出迷宫:\n");print_maze(a,b);printf("输入起点与终点:\n");scanf("%d,%d",&s.h,&s.l);scanf("%d,%d",&e.h,&e.l);mazepath(maze,s,e);printf("输出迷宫图和路线:\n");print_tu(a,b);}递归#include#includeintmaze[9][9]={1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,0,0,1,0,0,1,1,0,1,0,1,0,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1};voidprintmaze(){inti,j;for(i=0;i<9;i++){for(j=0;j<9;j++){if(maze[i][j]==1)printf("#");elseif(maze[i][j]==-1)printf("+");elseprintf("");}printf("\n");}}voidpass(intx,inty){maze[x][y]=-1;if(x==7&&y==7){printf("输出路径\n");printmaze();}if(maze[x][y+1]==0)pass(x,y+1);if(maze[x+1][y]==0)pass(x+1,y);if(maze[x-1][y]==0)pass(x-1,y);if(maze[x][y-1]==0)pass(x,y-1);maze[x][y]=0;}intmain(){intinx=1,iny=1;printf("迷宫图是:\n");printmaze();pass(inx,iny);}
if(maze[i][j]==1);
print(“#”)//#表示墙
elseif(maze[i][j]==0)
print(“”)
elseprint(“+”)//+表示路径
2.递归
voidprintmaze()
voidpass(intx,inty)
将访问点标记maze[x][y]=-1;
if(x,y是终点坐标)
调用printmaze()输出栈里的元素;
if(x,y的左边是通路)
递归调用pass(x,y-1);
if(x,y的右边是通路)
递归调用pass(x,y+1);
if(x,y的上边是通路)
递归调用pass(x-1,y);
if(x,y的下边是通路)
递归调用pass(x+1,y);
4.测试与分析
【小结或讨论】
这次的项目,加强了我动手、思考和解决问题的能力。
巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力培养了我查阅参考书,查阅手册及文献资料的能力。
培养独立思考,深入研究,分析问题、解决问题的能力。
通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。
附页源程序
#include
#defineN110
#defineN210
intmaze[N1][N2];//迷宫数组
typedefstruct{//起点终点坐标
typedefstructcell{
}TCell;//栈的元素结构
TCellS[N1*N2];//栈
voidcreat_maze(inta,intb)//建立迷宫
inti,j;
for(i=0;ifor(j=0;jscanf("%d",&maze[i][j]);}voidprint_maze(inta,intb)//打印迷宫{inti,j;for(i=0;i{for(j=0;jprintf("%d",maze[i][j]);printf("\n");}}voidprint_tu(inta,intb)//打印迷宫路径图{inti,j;for(i=0;i{for(j=0;j{if(maze[i][j]==1)printf("#");elseif(maze[i][j]==0)printf("");elseprintf("+");}printf("\n");}}voidmazepath(intmaze[N1][N2],Ts,Te)//搜索路径{inttop=0;inti,j,k,find,di;S[top].row=s.h;S[top].col=s.l;S[top].dir=-1;maze[s.h][s.l]=-1;while(top>=0){i=S[top].row;j=S[top].col;di=S[top].dir;if(i==e.h&&j==e.l){printf("输出迷宫路径三元组:\n");for(k=0;k<=top;k++)printf("%d%d%d\n",S[k].row,S[k].col,S[k].dir);return;}find=0;while(find==0&&di<4){di++;switch(di){case0:{i=S[top].row-1;j=S[top].col;break;}case1:{i=S[top].row;j=S[top].col+1;break;}case2:{i=S[top].row+1;j=S[top].col;break;}case3:{i=S[top].row;j=S[top].col-1;break;}}if(maze[i][j]==0)find=1;}if(find==1){S[top].dir=di;top++;S[top].row=i;S[top].col=j;maze[i][j]=-1;}else{maze[S[top].row][S[top].col]=0;top--;}}printf("没有路径\n");}intmain()//主函数{inta,b;Ts,e;printf("输入迷宫的行数与列数:\n");scanf("%d,%d",&a,&b);printf("输入迷宫数据:\n");creat_maze(a,b);printf("输出迷宫:\n");print_maze(a,b);printf("输入起点与终点:\n");scanf("%d,%d",&s.h,&s.l);scanf("%d,%d",&e.h,&e.l);mazepath(maze,s,e);printf("输出迷宫图和路线:\n");print_tu(a,b);}递归#include#includeintmaze[9][9]={1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,0,0,1,0,0,1,1,0,1,0,1,0,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1};voidprintmaze(){inti,j;for(i=0;i<9;i++){for(j=0;j<9;j++){if(maze[i][j]==1)printf("#");elseif(maze[i][j]==-1)printf("+");elseprintf("");}printf("\n");}}voidpass(intx,inty){maze[x][y]=-1;if(x==7&&y==7){printf("输出路径\n");printmaze();}if(maze[x][y+1]==0)pass(x,y+1);if(maze[x+1][y]==0)pass(x+1,y);if(maze[x-1][y]==0)pass(x-1,y);if(maze[x][y-1]==0)pass(x,y-1);maze[x][y]=0;}intmain(){intinx=1,iny=1;printf("迷宫图是:\n");printmaze();pass(inx,iny);}
for(j=0;j
scanf("%d",&maze[i][j]);
voidprint_maze(inta,intb)//打印迷宫
for(i=0;i{for(j=0;jprintf("%d",maze[i][j]);printf("\n");}}voidprint_tu(inta,intb)//打印迷宫路径图{inti,j;for(i=0;i{for(j=0;j{if(maze[i][j]==1)printf("#");elseif(maze[i][j]==0)printf("");elseprintf("+");}printf("\n");}}voidmazepath(intmaze[N1][N2],Ts,Te)//搜索路径{inttop=0;inti,j,k,find,di;S[top].row=s.h;S[top].col=s.l;S[top].dir=-1;maze[s.h][s.l]=-1;while(top>=0){i=S[top].row;j=S[top].col;di=S[top].dir;if(i==e.h&&j==e.l){printf("输出迷宫路径三元组:\n");for(k=0;k<=top;k++)printf("%d%d%d\n",S[k].row,S[k].col,S[k].dir);return;}find=0;while(find==0&&di<4){di++;switch(di){case0:{i=S[top].row-1;j=S[top].col;break;}case1:{i=S[top].row;j=S[top].col+1;break;}case2:{i=S[top].row+1;j=S[top].col;break;}case3:{i=S[top].row;j=S[top].col-1;break;}}if(maze[i][j]==0)find=1;}if(find==1){S[top].dir=di;top++;S[top].row=i;S[top].col=j;maze[i][j]=-1;}else{maze[S[top].row][S[top].col]=0;top--;}}printf("没有路径\n");}intmain()//主函数{inta,b;Ts,e;printf("输入迷宫的行数与列数:\n");scanf("%d,%d",&a,&b);printf("输入迷宫数据:\n");creat_maze(a,b);printf("输出迷宫:\n");print_maze(a,b);printf("输入起点与终点:\n");scanf("%d,%d",&s.h,&s.l);scanf("%d,%d",&e.h,&e.l);mazepath(maze,s,e);printf("输出迷宫图和路线:\n");print_tu(a,b);}递归#include#includeintmaze[9][9]={1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,0,0,1,0,0,1,1,0,1,0,1,0,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1};voidprintmaze(){inti,j;for(i=0;i<9;i++){for(j=0;j<9;j++){if(maze[i][j]==1)printf("#");elseif(maze[i][j]==-1)printf("+");elseprintf("");}printf("\n");}}voidpass(intx,inty){maze[x][y]=-1;if(x==7&&y==7){printf("输出路径\n");printmaze();}if(maze[x][y+1]==0)pass(x,y+1);if(maze[x+1][y]==0)pass(x+1,y);if(maze[x-1][y]==0)pass(x-1,y);if(maze[x][y-1]==0)pass(x,y-1);maze[x][y]=0;}intmain(){intinx=1,iny=1;printf("迷宫图是:\n");printmaze();pass(inx,iny);}
printf("%d",maze[i][j]);
printf("\n");
voidprint_tu(inta,intb)//打印迷宫路径图
for(i=0;i{for(j=0;j{if(maze[i][j]==1)printf("#");elseif(maze[i][j]==0)printf("");elseprintf("+");}printf("\n");}}voidmazepath(intmaze[N1][N2],Ts,Te)//搜索路径{inttop=0;inti,j,k,find,di;S[top].row=s.h;S[top].col=s.l;S[top].dir=-1;maze[s.h][s.l]=-1;while(top>=0){i=S[top].row;j=S[top].col;di=S[top].dir;if(i==e.h&&j==e.l){printf("输出迷宫路径三元组:\n");for(k=0;k<=top;k++)printf("%d%d%d\n",S[k].row,S[k].col,S[k].dir);return;}find=0;while(find==0&&di<4){di++;switch(di){case0:{i=S[top].row-1;j=S[top].col;break;}case1:{i=S[top].row;j=S[top].col+1;break;}case2:{i=S[top].row+1;j=S[top].col;break;}case3:{i=S[top].row;j=S[top].col-1;break;}}if(maze[i][j]==0)find=1;}if(find==1){S[top].dir=di;top++;S[top].row=i;S[top].col=j;maze[i][j]=-1;}else{maze[S[top].row][S[top].col]=0;top--;}}printf("没有路径\n");}intmain()//主函数{inta,b;Ts,e;printf("输入迷宫的行数与列数:\n");scanf("%d,%d",&a,&b);printf("输入迷宫数据:\n");creat_maze(a,b);printf("输出迷宫:\n");print_maze(a,b);printf("输入起点与终点:\n");scanf("%d,%d",&s.h,&s.l);scanf("%d,%d",&e.h,&e.l);mazepath(maze,s,e);printf("输出迷宫图和路线:\n");print_tu(a,b);}递归#include#includeintmaze[9][9]={1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,0,0,1,0,0,1,1,0,1,0,1,0,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1};voidprintmaze(){inti,j;for(i=0;i<9;i++){for(j=0;j<9;j++){if(maze[i][j]==1)printf("#");elseif(maze[i][j]==-1)printf("+");elseprintf("");}printf("\n");}}voidpass(intx,inty){maze[x][y]=-1;if(x==7&&y==7){printf("输出路径\n");printmaze();}if(maze[x][y+1]==0)pass(x,y+1);if(maze[x+1][y]==0)pass(x+1,y);if(maze[x-1][y]==0)pass(x-1,y);if(maze[x][y-1]==0)pass(x,y-1);maze[x][y]=0;}intmain(){intinx=1,iny=1;printf("迷宫图是:\n");printmaze();pass(inx,iny);}
for(j=0;j{if(maze[i][j]==1)printf("#");elseif(maze[i][j]==0)printf("");elseprintf("+");}printf("\n");}}voidmazepath(intmaze[N1][N2],Ts,Te)//搜索路径{inttop=0;inti,j,k,find,di;S[top].row=s.h;S[top].col=s.l;S[top].dir=-1;maze[s.h][s.l]=-1;while(top>=0){i=S[top].row;j=S[top].col;di=S[top].dir;if(i==e.h&&j==e.l){printf("输出迷宫路径三元组:\n");for(k=0;k<=top;k++)printf("%d%d%d\n",S[k].row,S[k].col,S[k].dir);return;}find=0;while(find==0&&di<4){di++;switch(di){case0:{i=S[top].row-1;j=S[top].col;break;}case1:{i=S[top].row;j=S[top].col+1;break;}case2:{i=S[top].row+1;j=S[top].col;break;}case3:{i=S[top].row;j=S[top].col-1;break;}}if(maze[i][j]==0)find=1;}if(find==1){S[top].dir=di;top++;S[top].row=i;S[top].col=j;maze[i][j]=-1;}else{maze[S[top].row][S[top].col]=0;top--;}}printf("没有路径\n");}intmain()//主函数{inta,b;Ts,e;printf("输入迷宫的行数与列数:\n");scanf("%d,%d",&a,&b);printf("输入迷宫数据:\n");creat_maze(a,b);printf("输出迷宫:\n");print_maze(a,b);printf("输入起点与终点:\n");scanf("%d,%d",&s.h,&s.l);scanf("%d,%d",&e.h,&e.l);mazepath(maze,s,e);printf("输出迷宫图和路线:\n");print_tu(a,b);}递归#include#includeintmaze[9][9]={1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,0,0,1,0,0,1,1,0,1,0,1,0,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1};voidprintmaze(){inti,j;for(i=0;i<9;i++){for(j=0;j<9;j++){if(maze[i][j]==1)printf("#");elseif(maze[i][j]==-1)printf("+");elseprintf("");}printf("\n");}}voidpass(intx,inty){maze[x][y]=-1;if(x==7&&y==7){printf("输出路径\n");printmaze();}if(maze[x][y+1]==0)pass(x,y+1);if(maze[x+1][y]==0)pass(x+1,y);if(maze[x-1][y]==0)pass(x-1,y);if(maze[x][y-1]==0)pass(x,y-1);maze[x][y]=0;}intmain(){intinx=1,iny=1;printf("迷宫图是:\n");printmaze();pass(inx,iny);}
if(maze[i][j]==1)
printf("#");
printf("");
else
printf("+");
voidmazepath(intmaze[N1][N2],Ts,Te)//搜索路径
inttop=0;
inti,j,k,find,di;
S[top].dir=-1;
maze[s.h][s.l]=-1;
while(top>=0)
i=S[top].row;
j=S[top].col;
di=S[top].dir;
if(i==e.h&&j==e.l)
printf("输出迷宫路径三元组:
\n");
for(k=0;k<=top;k++)
printf("%d%d%d\n",S[k].row,S[k].col,S[k].dir);
return;
find=0;
while(find==0&&di<4)
di++;
switch(di)
case0:
{i=S[top].row-1;j=S[top].col;
break;
case1:
{i=S[top].row;j=S[top].col+1;
case2:
{i=S[top].row+1;j=S[top].col;
case3:
{i=S[top].row;j=S[top].col-1;
if(maze[i][j]==0)find=1;
if(find==1)
S[top].dir=di;
top++;
S[top].row=i;S[top].col=j;
maze[i][j]=-1;
maze[S[top].row][S[top].col]=0;
top--;
printf("没有路径\n");
intmain()//主函数
inta,b;
Ts,e;
printf("输入迷宫的行数与列数:
scanf("%d,%d",&a,&b);
printf("输入迷宫数据:
creat_maze(a,b);
printf("输出迷宫:
print_maze(a,b);
printf("输入起点与终点:
scanf("%d,%d",&s.h,&s.l);
scanf("%d,%d",&e.h,&e.l);
mazepath(maze,s,e);
printf("输出迷宫图和路线:
print_tu(a,b);
intmaze[9][9]={
1,1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,0,1,
1,0,1,1,0,1,1,0,1,
1,0,1,0,0,1,0,0,1,
1,0,1,0,1,0,1,0,1,
1,0,0,0,0,0,1,0,1,
1,1,0,1,1,0,1,1,1,
1,1,1,1,1,1,1,1,1
};
for(i=0;i<9;i++)
for(j=0;j<9;j++)
elseif(maze[i][j]==-1)
elseprintf("");
maze[x][y]=-1;
if(x==7&&y==7)
printf("输出路径\n");
printmaze();
if(maze[x][y+1]==0)
pass(x,y+1);
if(maze[x+1][y]==0)
pass(x+1,y);
if(maze[x-1][y]==0)
pass(x-1,y);
if(maze[x][y-1]==0)
pass(x,y-1);
maze[x][y]=0;
intmain()
intinx=1,iny=1;
printf("迷宫图是:
pass(inx,iny);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1