迷宫问题课程设计论文.docx
- 文档编号:28545272
- 上传时间:2023-07-18
- 格式:DOCX
- 页数:37
- 大小:682.30KB
迷宫问题课程设计论文.docx
《迷宫问题课程设计论文.docx》由会员分享,可在线阅读,更多相关《迷宫问题课程设计论文.docx(37页珍藏版)》请在冰豆网上搜索。
迷宫问题课程设计论文
存档资料成绩:
华东交通大学理工学院
课程设计报告书
所属课程名称数据结构课程设计
题目深度与广度搜索:
迷宫问题
分院
专业班级计算机科学与技术2班
学 号
学生姓名
指导教师
2014年6月17日
序号
项目
等 级
优秀
良好
中等
及格
不及格
1
课程设计态度评价
2
出勤情况评价
3
任务难度评价
4
工作量饱满评价
5
任务难度评价
6
设计中创新性评价
7
论文书写规范化评价
8
综合应用能力评价
综合评定等级
课程设计(论文)评阅意见
评阅人 职称
20年月日
目 录
第1章课程设计内容及要求
1.1设计内容
课程设计将要设计并实现一个基于深度优先遍历和广度优先遍历的迷宫程序,程序均由c/c++代码实现,能够自动寻迷宫的终点,并由图形界面演示,图形界面的制作基于win32编程实现。
1.2设计要求
1.本设计程序需要拥有图形界面
2.分别以深度优先遍历及广度优先遍历方法进行寻找迷宫终点的演示
3.建立每个单元格四面墙的X*Y位迷宫程序
4.通过随机种子随机拆墙,因此进行两种遍历所发生的路径也是不一样的
5.拥有动态的演示效果,可以观测到深度和广度优先遍历的不同寻径方向和不同的寻径方法
第二章总体设计
2.1.环境设置
1.操作系统:
windows7sp1专业版,windows8专业版,windowsxpsp3
2.程序设计语言:
c/c++
3.开发工具:
编译:
visualc++6.0
编码:
notepad++6.6.1
4:
外部接口:
win32API,因此需要借助Microsoftvisualc++的环境进行编译实现
2.2.图形界面设计
1:
本程序设计采用的是基于windows32API的图形化接口建立的两种类型的图形界面。
包括winMain函数的主窗口界面以及MessageBox消息界面。
所有程序均基于c++语言。
2:
图形界面演示。
(1)消息窗口
(2)主窗口
2.3.设计思路
程序设计框图如下:
(注:
Messagebox是消息框,分别表示标题栏和开始拆墙和开始深度优先搜索和广度优先搜索。
WinMain为主窗口,承载拆墙及各种遍历的实现。
NewWinMain为拆墙后的主窗口。
)
第三章功能实现
3.1.主窗口及消息窗口的实现
(1)窗口函数
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
(2)WinMain函数
intWINAPIWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
PSTRszCmdLine,
intiCmdShow){};
(3)注册窗口
iScreenWide=GetSystemMetrics(SM_CXFULLSCREEN);//获取分辨率及置于中间
hwnd=CreateWindow(
AppName,//窗口类名
"深度、广度优先搜索迷宫",//窗口实例的标题名
WS_MINIMIZEBOX|WS_SYSMENU,//窗口的风格
iScreenWide/2-W*CELL/2,//窗口左上角横坐标(X)
CELL,//窗口左上角纵坐标(Y)
(W+0.3)*CELL,//窗口的宽,而不是客户区的宽
(H+1.2)*CELL,//窗口的高,而不是客户区的高
NULL,//窗口无父窗口
NULL,//窗口无主菜单
hInstance,//创建此窗口的应用程序的当前句柄
NULL//不使用该值
);
(4)消息窗口
MessageBox(NULL,TEXT("主程序:
彭俊威"),TEXT("数据结构课程设计"),MB_ICONINFORMATION);
MessageBox(NULL,TEXT("开始深度优先搜索"),TEXT("搜索方式"),NULL);
MessageBox(NULL,TEXT("开始广度优先搜索"),TEXT("搜索方式"),NULL);
3.2.文件流的实现
(1)将拆墙数据存储在txt文本中,以便下次使用时不必再拆墙。
std:
:
ifstreamf("d:
\\迷宫拆墙数据.txt");
f>>col>>row;
f.close();
WriteDocument(mazeedge,wall,i);
(2)读取文件流
std:
:
ifstreamf("d:
\\迷宫拆墙数据.txt");
f>>col>>row;//从txt文件中获取原来迷宫的规模
f.close();
std:
:
ifstreamf1("d:
\\每个单元格四面墙的数据.txt");
for(i=0;i
f1>>wall[i].wall_l>>wall[i].wall_t>>wall[i].wall_r>>wall[i].wall_b;
f1.close();
3.3.构造迷宫
(1)构造AXB的矩阵。
本程序使用的是15X15的矩阵,即总共有255个格子。
constintCELL=25;//单元像素宽
constintW=15;//迷宫宽度
constintH=15;//迷宫高度
structPOSITION//每一个单元格的左上坐标
{
intx;//单元格横坐标(单位pixel)
inty;//单元格纵坐标
intindex_x;//单元格横标
intindex_y;//单元格纵标
};
(2)拆除单独存在的格子,产生通路
DrawPath(hdc,W,H){…
MessageBox(NULL,TEXT("现在开始拆墙"),TEXT("消息"),NULL);
srand(time(NULL));//系统时间作随机种子
x=rand()%col;//随机产生起始点
y=rand()%row;
Stack.push(position[y*col+x]);//迷宫入口进栈
visited[y*col+x]=true;//标记已经访问过
while(!
Stack.empty())};
voidReplace(HDChdc,intx,inty,intz,intk)
{
HPENhpen;
hpen=CreatePen(PS_SOLID,1,RGB(255,255,255));
SelectObject(hdc,hpen);
MoveToEx(hdc,x,y,NULL);
LineTo(hdc,z,k);
DeleteObject(hpen);
…
};
3.4.深度及广度搜索寻径
(1)深度搜索寻径,使用栈存储
voidDFS(HDChdc){};
Stack.push(position[entrance]);//迷宫入口进栈
visited[entrance]=true;
Stack.pop();//回溯
(2)广度搜索寻径,使用队列存储
voidBFS(HDChdc){};
Queue.push(position[entrance]);//迷宫入口进队列
visited[entrance]=true;
Stack.pop();//回溯
第4章测试
4.1将A*B的矩阵墙拆成迷宫
4.2进行深度优先搜索
在未搜索到的情况下进行回溯,从进入此条路径的分叉口选择另一条路。
4.3进行广度优先搜索
第一步搜索完成后会进行清屏。
4.4漏洞分析
在windowsxp的环境下会偶尔出现不能清屏的问题,那是因为windowsxp系统默认内存,而当PC的实际内存低于默认内存时会产生内存不足的问题,导致图形载入出问题,但是在清除历史数据之后就不会出问题了。
第5章算法分析
5.1时间复杂度分析
由于该图采用邻接矩阵存储,整个算法遍历的过程所花费的时间复杂度为该矩阵的N(row*col)。
而由于其需要分别访问已经定位,需要进行分别2次操作,如下:
visited=newbool[col*row];//访问标记
for(i=0;i for(j=0;j visited[i*col+j]=false;//初始为未访问状态 position=newPOSITION[col*row]; for(i=0;i for(j=0;j { position[i*col+j].x=j*CELL; position[i*col+j].y=i*CELL; position[i*col+j].index_x=j; position[i*col+j].index_y=i; } 因此在遍历的时候所需要的时间复杂度为N(2*row*col)。 由于深度优先搜索和广度优先搜索都是采用同样的存储方式,并且都是遍历搜索,因此时间复杂度相同,都是N(2*row*col)。 (注: row,col分别表示迷宫的行和列)。 5.2空间复杂度分析 5.2.1深度优先搜索空间复杂度分析 当进行深度优先搜索时,所遍历的最短路径即为单一路径,因此最好的空间复杂度是N(row+col),而最坏情况为N(row*col),即通过了最大的回溯之后才找到终点路径。 5.2.2广度优先搜索空间复杂度分析 当进行广度优先搜索的时候,路径经过所有可能的路径,即最大为row*col,因此,空间复杂度为N(row*col)。 第6章课程设计心得 终于算是完成了课程设计的全部内容,内心百感交集,本来以为课程设计的内容是很简单的,因为不急不忙的慢慢写着,到同学们都要交的时候我才发现自己还没有做完,顿时觉得是自己出了问题。 然后,慢慢的开始在网络上寻找资料,询问前辈的经验和知识,通过同学们和老师的帮助,在自己的努力下,很快的完成了设计内容,并做出了分析报告,感谢老师的认同与朋友们的关系,一起努力。 参考文献 [1]杨厚群.数据结构(C语言描述)[M].上海: 上海交通大学出版社,2013年1月 [2]程杰.大话数据结构[M]北京: 清华大学出版社2011年6月 [3]ThomasH.Cormen,CharlesE.Leiserson,RonaldL.Rivest,CliffordStein.算法导论(原书第3版)[M]北京: 机械工业出版社2013年7月 [4]RobertSedgewick.算法: C语言实现(第1~4部分)基础知识、数据结构、排序及搜索(原书第3版)[M]北京: 机械工业出版社2009年10月 附录(源程序) #include #include #include #include #include #include #include constintCELL=25;//单元像素宽 constintW=15;//迷宫宽度 constintH=15;//迷宫高度 structPOSITION//每一个单元格的左上坐标 { intx;//单元格横坐标(单位pixel) inty;//单元格纵坐标 intindex_x;//单元格横标 intindex_y;//单元格纵标 }; structMazeEdge//储存的是原来迷宫所拆的墙,下次生成迷宫和原来一样拆 { intx; inty; intz; intw; }; structWall { intwall_r;//右墙数据 intwall_l;//左墙数据 intwall_t;//上墙数据 intwall_b;//下墙数据 }; LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数 voidDrawWhiteGround(HDChdc);//将整个客户区绘制为白色 voidDrawRedBlock(HDChdc,intl,intt,intr,intb);//绘制迷宫起始点与终止点 voidDrawRect(HDChdc,intl,intt,intr,intb);//绘制单元方格 voidDrawCell(HDChdc,intl,intt,intr,intb);//绘制移动方块 voidDrawGamePlace(HDChdc,intcol,introw);//在客户区绘满单元格 voidDrawPath(HDChdc,intw,inth);//迷宫拆墙 boolAdj(intx,inty,bool*visited,intcol);//判断该单元格是否有没有被访问的相邻单元格 boolAdj_NoWall(intx,inty,bool*visited,Wall*wall,intcol);//判断该单元格是否有没有被访问的相邻单元格并且周围没有墙可以访问 voidReplace(HDChdc,intx,inty,intz,intk);//拆墙(用白色划线替换红色划线) voidWriteDocument(MazeEdge*mazeedge,Wall*wall,inti);//将迷宫拆墙数据写入txt文件中 boolReadDocument(HDChdc);//从txt文件中读取迷宫拆墙数据 voidDFS(HDChdc);//深度优先搜索寻找迷宫路径 voidBFS(HDChdc);//广度优先搜索寻找迷宫路径 //--------------------------------------------------------------- intWINAPIWinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance, PSTRszCmdLine, intiCmdShow) { staticcharAppName[]="ToyBrick";//窗口类名 HWNDhwnd; MSGmsg;//消息结构 WNDCLASSEXwndclass;//窗口类 intiScreenWide;//定义一个整型变量来取得窗口的宽度 wndclass.cbSize=sizeof(wndclass); wndclass.style=CS_HREDRAW|CS_VREDRAW;//窗口类型 wndclass.lpfnWndProc=WndProc;//窗口处理函数为WndProc wndclass.cbClsExtra=0;//窗口类无扩展 wndclass.cbWndExtra=0;//窗口实例无扩展 wndclass.hInstance=hInstance;//当前实例句柄 wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//默认图标 wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//箭头光标 wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//背景为黑色 wndclass.lpszMenuName=NULL;//窗口中无菜单 wndclass.lpszClassName=AppName;//类名为"ToyBrick" wndclass.hIconSm=LoadIcon(NULL,IDI_INFORMATION); //----------------------------------窗口类的注册----------------------------------------- if(! RegisterClassEx(&wndclass))//如果注册失败则发出警报声音,返回FALSE { MessageBeep(0); returnFALSE; } //获取显示器分辨率的X值iScreenWide,将程序窗口置于屏幕中央 iScreenWide=GetSystemMetrics(SM_CXFULLSCREEN); hwnd=CreateWindow( AppName,//窗口类名 "深度、广度优先搜索迷宫",//窗口实例的标题名 WS_MINIMIZEBOX|WS_SYSMENU,//窗口的风格 iScreenWide/2-W*CELL/2,//窗口左上角横坐标(X) CELL,//窗口左上角纵坐标(Y) (W+0.3)*CELL,//窗口的宽,而不是客户区的宽 (H+1.2)*CELL,//窗口的高,而不是客户区的高 NULL,//窗口无父窗口 NULL,//窗口无主菜单 hInstance,//创建此窗口的应用程序的当前句柄 NULL//不使用该值 ); if(! hwnd)returnFALSE; MessageBox(NULL,TEXT("主程序: 彭俊威"),TEXT("数据结构课程设计"),MB_ICONINFORMATION); //显示窗口 ShowWindow(hwnd,iCmdShow); //绘制客户区 UpdateWindow(hwnd); //消息循环 while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } //消息循环结束即程序终止时将消息返回系统 returnmsg.wParam; } //-------------------窗口过程函数WndProc----------------------------- LRESULTCALLBACKWndProc(HWNDhwnd,UINTiMsg,WPARAMwParam,LPARAMlParam) { HDChdc; PAINTSTRUCTps; //charBuffer[20]; switch(iMsg) { //WM_PAINT(窗口第一次生成时执行,WM_PAINT将图从内存拷到屏幕上) caseWM_PAINT: hdc=BeginPaint(hwnd,&ps);//获得设备环境句柄 DrawGamePlace(hdc,W,H);//在客户区绘满单元格 if(! ReadDocument(hdc)) DrawPath(hdc,W,H);//拆墙 MessageBox(NULL,TEXT("开始深度优先搜索"),TEXT("搜索方式"),NULL); DFS(hdc);//深度优先搜索寻找迷宫出口 DrawWhiteGround(hdc);//将客户区还原为白色背景 ReadDocument(hdc);//重新绘制迷宫 MessageBox(NULL,TEXT("开始广度优先搜索"),TEXT("搜索方式"),NULL); BFS(hdc);//广度优先搜索寻找迷宫出口 EndPaint(hwnd,&ps); return0; //WM_DESTROY(响应关闭窗口动作) caseWM_DESTROY: PostQuitMessage(0); return0; } returnDefWindowProc(hwnd,iMsg,wParam,lParam); } ////////////////////////////////////////////////////////// //将整个客户区绘制为白色 voidDrawWhiteGround(HDChdc) { intcol,row; std: : ifstreamf("d: \\迷宫拆墙数据.txt"); f>>col>>row; f.close(); HBRUSHhbrush=CreateSolidBrush(RGB(255,255,255)); SelectObject(hdc,hbrush); Rectangle(hdc,0,0,col*CELL,row*CELL); DeleteObject(hbrush); } //绘制迷宫起始点与终止点 voidDrawRedBlock(HDChdc,intl,intt,intr,intb) { HBRUSHhbrush=CreateSolidBrush(RGB(255,0,0)); SelectObject(hdc,hbrush); Rectangle(hdc,l,t,r,b); DeleteObject(hbrush); } //拆墙(用白色划线替换红色划线) voidReplace(HDChdc,intx,inty,intz,intk) { HPENhpen; hpen=CreatePen(PS_SOLID,1,RGB(255,255,255)); SelectObject(hdc,hpen); MoveToEx(hdc,x,y,NULL); LineTo(hdc,z,k); DeleteObject(hpen); } //画单元格,后面四个参数依次为左上坐标和右下坐标 voidDrawRect(HDChdc,intl,intt,intr,intb) { MoveToEx(hdc,l,t,NULL);//将起始点移动到(l,t) LineTo(hdc,r,t); LineTo(hdc,r,b); LineTo(hdc,l,b); LineTo(hdc,l,t); } //用绿色画刷画移动目标 voidDrawCell(HDC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 迷宫 问题 课程设计 论文