迷宫问题.docx

上传人:b****6 文档编号:7290295 上传时间:2023-01-22 格式:DOCX 页数:10 大小:90.78KB
下载 相关 举报
迷宫问题.docx_第1页
第1页 / 共10页
迷宫问题.docx_第2页
第2页 / 共10页
迷宫问题.docx_第3页
第3页 / 共10页
迷宫问题.docx_第4页
第4页 / 共10页
迷宫问题.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

迷宫问题.docx

《迷宫问题.docx》由会员分享,可在线阅读,更多相关《迷宫问题.docx(10页珍藏版)》请在冰豆网上搜索。

迷宫问题.docx

迷宫问题

 

洛阳理工学院

课程设计报告

课程名称数据结构

设计题目迷宫问题

课程设计任务书

设计题目:

迷宫问题

设计内容与要求:

迷宫实验是取自心理学的一个古典实验。

在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒中设置了许多墙,对行进方向形成了多处阻挡。

盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。

对同一只老鼠重复进行上述实验,一直到老鼠从入口到出口,而不走错一步。

老鼠经多次实验终于得到它学习走迷宫的路线。

设计一个计算机程序对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

课程设计评语

 

成绩:

指导教师:

_______________

年月日

一、问题描述

迷宫实验是取自心理学的一个古典实验。

在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒中设置了许多墙,对行进方向形成了多处阻挡。

盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。

对同一只老鼠重复进行上述实验,一直到老鼠从入口到出口,而不走错一步。

老鼠经多次实验终于得到它学习走迷宫的路线。

设计一个计算机程序对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

 

二、基本要求

可以利用一个二维数组maze[i][j]表示迷宫,其中1<=i<=m,1<=j<=n,m和n分别代表迷宫的行数和列数。

数组元素值为1表示该位置是墙壁,不能通行;元素值为0表示该位置是通路。

假定从maze[1][1]出发,出口位于maze[m][n],移动方向可以是8个方向(东、东南、南、西南、西、西北、北和东北)。

计算机解迷宫时,通常用的是“穷举求解”的方法,即从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。

为了保证在任何位置上都能沿原路退回,需要用一个后进先出的栈结构来保存从入口到当前位置的路径。

三、数据结构

typedefstructlistnode

{intadjno;

structlistnode*next;

}listnode;

typedefstruct

{intdata;

listnode*first;

}headnode;

typedefstruct

{headnodevexs[MAX*MAX];

intvexnum;

intrownum;

intcolnum;

}adjlist;

四、总体设计

 

五、详细设计

adjlistinput(intmaze[][MAX],adjlistG)输入迷宫矩阵,用0表示可以通过,1表示墙壁。

adjlistchange(intmaze[][MAX],adjlistG)将二维数组转换为无向图。

inttravgraph(adjlistG,intrecord[],intentry,intexit)广度优先遍历无向图。

voidoutput(intrecord[],intentry,intexit)找到从出口到入口的路径。

以上各个函数都是从主函数中进入,利用二维数组存储数据,并转化无向为图来遍历,最终输出路径。

 

六、测试与调试

 

七、源程序清单

#include

#include

#defineMAX15

#defineNULL0

typedefstructlistnode

{intadjno;

structlistnode*next;

}listnode;

typedefstruct

{intdata;

listnode*first;

}headnode;

typedefstruct

{headnodevexs[MAX*MAX];

intvexnum;

intrownum;

intcolnum;

}adjlist;

adjlistG;/*输入迷宫,0为可通行,1为不可通行,用二维矩阵表示*/

adjlistinput(intmaze[][MAX],adjlistG)

{

inti,j;

intrownum,colnum;

printf("Pleaseinputthelengthofthemaze:

\n");

printf("rownum=");scanf("%d",&G.rownum);

printf("colnum=");scanf("%d",&G.colnum);

for(i=0;i

{

printf("Inputthe%drow:

[%d]",i+1,i+1);

for(j=0;j

scanf("%d",&maze[i][j]);

}

return(G);

}

/*二维数组向无向图的转化*/

adjlistchange(intmaze[][MAX],adjlistG)

{

inti,j;

listnode*p;

G.vexnum=G.rownum*G.colnum;

for(i=0;i

/*图中结点的初始化*/

{

G.vexs[i].data=maze[i/G.colnum][i%G.colnum];

G.vexs[i].first=NULL;

}

for(i=0;i

for(j=0;j

{

if(i-1>=0&&maze[i-1][j]==0)

{

p=(listnode*)malloc(sizeof(listnode));

p->adjno=(i-1)*G.colnum+j;

p->next=G.vexs[i*G.colnum+j].first;

G.vexs[i*G.colnum+j].first=p;

}

if(i+1

{

p=(listnode*)malloc(sizeof(listnode));

p->adjno=(i+1)*G.colnum+j;

p->next=G.vexs[i*G.colnum+j].first;

G.vexs[i*G.colnum+j].first=p;

}

if(j-1>=0&&maze[i][j-1]==0)

{

p=(listnode*)malloc(sizeof(listnode));

p->adjno=i*G.colnum+j-1;

p->next=G.vexs[i*G.colnum+j].first;

G.vexs[i*G.colnum+j].first=p;

}

if(j+1

{

p=(listnode*)malloc(sizeof(listnode));

p->adjno=i*G.colnum+j+1;

p->next=G.vexs[i*G.colnum+j].first;

G.vexs[i*G.colnum+j].first=p;

}

if(i-1>=0&&j-1>=0&&maze[i-1][j-1]==0)

{

p=(listnode*)malloc(sizeof(listnode));

p->adjno=(i-1)*G.colnum+j-1;

p->next=G.vexs[i*G.colnum+j].first;

G.vexs[i*G.colnum+j].first=p;

}

if(i-1>=0&&j+1

{

p=(listnode*)malloc(sizeof(listnode));

p->adjno=(i-1)*G.colnum+j+1;

p->next=G.vexs[i*G.colnum+j].first;

G.vexs[i*G.colnum+j].first=p;

}

if(i+1=0&&maze[i+1][j-1]==0)

{

p=(listnode*)malloc(sizeof(listnode));

p->adjno=(i+1)*G.colnum+j-1;

p->next=G.vexs[i*G.colnum+j].first;

G.vexs[i*G.colnum+j].first=p;

}

if(i+1

{

p=(listnode*)malloc(sizeof(listnode));

p->adjno=(i+1)*G.colnum+j+1;

p->next=G.vexs[i*G.colnum+j].first;

G.vexs[i*G.colnum+j].first=p;

}

}

return(G);

}

/*用inttravgraph()函数广度优先遍历无向图*/

inttravgraph(adjlistG,intrecord[],intentry,intexit)

{

listnode*p;

intqueue[MAX*MAX],visited[MAX*MAX];/*用visited[]数组标记图的结点是否遍历过*/

inti;

intfront=0,rear=1;

for(i=0;i

{

record[i]=-1;/*置record[i]为-1,以便检查从入口到出口结点V[n]有无通路*/

visited[i]=0;

}

visited[entry]=1;

queue[rear]=entry;

while(front!

=rear)/*记录遍历路径,(record[i],i)表示存在从结点record[i]到i的边*/

{

p=G.vexs[queue[front+1]].first;

while(p!

=NULL)

{

if(visited[p->adjno]==0)

{

visited[p->adjno]=1;

record[p->adjno]=queue[front+1];

queue[++rear]=p->adjno;

if(p->adjno==exit)

gotoend;

}

p=p->next;

}front=front+1;

}

end:

;

}

/*用回溯法找到从出口到入口的路径,并输出*/

voidoutput(intrecord[],intentry,intexit)

{

inti=0,t;

if(entry==exit&&G.vexs[exit].data==0)

printf("It'salreadyatexport\n");

elseif(record[exit]!

=-1)

{

t=exit;

{

printf("Themostshortpathisasfollows:

\n");

while(t!

=entry)

{

printf("[%d,%d]<-",t/G.colnum+1,t%G.colnum+1);

t=record[t];

if(++i%5==0)printf("\n");

}

printf("[%d,%d]",t/G.colnum+1,t%G.colnum+1);

}

}

else

printf("Havenopathfromtheentrancetotheexit\n");

}

voidmain()

{

intentry_row,entry_col,exit_row,exit_col,entry,exit;

intmaze[MAX][MAX];

intrecord[MAX*MAX];

G=input(maze,G);

G=change(maze,G);

printf("Inputtingthemazeentrancesitsthemark(*,*):

");

scanf("%d,%d",&entry_row,&entry_col);

printf("Inputtingthemazeexportstositthemark(*,*):

");

scanf("%d,%d",&exit_row,&exit_col);

entry=--entry_row*G.colnum+--entry_col;

exit=--exit_row*G.colnum+--exit_col;

travgraph(G,record,entry,exit);

output(record,entry,exit);

getch();

}

八、心得体会

在这一周课程设计的时候,拿到问题时便对问题进行了分析,并设计了完整的程序,但在执行的时候却不尽人意,总是出现这些那些的差错,使得自己很烦恼,当然,归根结底这是自己之前学习的不足,没有深刻的意识到自己所学的远远不够,表面上自己是可以能够做好,可现实却是差距非常大,很可笑。

不过无论怎么说,终究是完成了这份课程设计,如果以后有机会,自己一定会巩固我之前所学习的知识,将各个知识点的内容都学透,才能在应用的时候不至于手忙脚乱,这也不会那也不会的干着急。

所以,一定会好好努力,弥补自己在此次课程设计中的不足。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 考试认证 > 财会金融考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1