分享
分销 收藏 举报 申诉 / 11
播放页_导航下方通栏广告

类型农夫过河和骑士周游(数据结构课程设计)教学文案.doc

  • 上传人:w****g
  • 文档编号:3696671
  • 上传时间:2024-07-14
  • 格式:DOC
  • 页数:11
  • 大小:85.50KB
  • 下载积分:8 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    农夫 过河 骑士 周游 数据结构 课程设计 教学 文案
    资源描述:
    农夫过河和骑士周游(数据结构课程设计) 精品文档 姓名:高明 学号:129074151 专业:软件工程 2014/6/20 数据结构课程设计 1:实验要求 1.1实验目的 掌握图的遍历问题,运用图的遍历算法解决复杂问题。掌握并应用邻接存储结构和图的深度遍历问题。培养学习使用图的相关知识解决实际问题的能力。 1.2实验内容问题描述 问题描述:农夫携带一只狼,一只羊,一棵白菜从和的左岸到达河的右岸,由于船只较小,农夫每次只能携带一样过河,在无人看管的情况下狼吃羊,羊吃白菜。 1.3:实验输出要求 要求输出农夫携带所有东西安全过河的步骤。 2:程序设计分析 2.1:实验内容分析 农夫需要多次驾船往返于河的左右两岸,农夫每次过河都会使农夫,狼,羊,白菜的位置发生变化。利用四元组(农夫,狼,羊,白菜)来表示各自所处于河的左岸右岸的位置,0表示河的左岸,1表示河的右岸。初始状态时(0,0,0,0)都处在河的左岸,终态是(1,1,1,1)四者都处在河的右岸。 共有16种状态,但其中有些状态不安全,删除不安全的状态,将安全的状态按照合理的过河步骤联系起来. (0,0,0,0) (1,0,1,0) (0,0,1,0) (1,1,1,0) (1,0,1,1) (0,1,0,0) (0,0,0,1) (1,1,0,1) (0,1,0,1) (1,1,1,1) 安全过河状态图 2.2主要函数模块算法分析 1:栈的相关函数 PSeqStack Init_SeqStack(void) //栈的初始化 int Empty_SeqStack(PSeqStack s) //判断栈是否为空栈非空1表示栈空 void Push_SeqStack(PSeqStack s,int x) //入栈 int Pop_SeqStack(PSeqStack s,int *x) //出栈 int Size_SeqStack(PSeqStack s) //顺序栈中元素的个数 void Destroy_SeqStack(PSeqStack *S) //销毁栈 2,:求结点直接后继结点个数的函数 int CountAdjoin(MGraph *G,int u) 3:查找状态(f,w,s,v)在无向图中的位置的函数 int located(MGraph *G,int f,int w,int s,int v) 4:结点值安全状态判断函数 int if_safe(int f,int w,int s,int v) 5:判断农夫过河的两个状态是否是相邻的函数 int if_connected(MGraph *G,int i,int j) 6:创建农夫过河状态的无向图 void Creat_MGraph(MGraph *G) 7:广优度先遍历 遍历所有从状态下标u到状态下标v的路径函数 void BFS_path(MGraph *G,int u,int v) 8:输出所有从状态下标为u到状态下标为v的所有简单路径 void print_path(MGraph *G,int u,int v) 2.3部分函数源代码 path[u][m] 为状态下标u的直接后继状态下标 m表示状态下标u的直接后继结点个数:int path[MaxVertexNum][MaxVertexNum]; 主要结构:typedef struct { int farmer; int wolf; int sheep; int vegetable; }vertexType; //顶点结点类型 typedef struct { vertexType vertex[MaxVertexNum]; int edges[MaxVertexNum][MaxVertexNum]; int vertexNum; }MGraph; //邻接矩阵存储结构类型 typedef struct { int data[MAXSIZE]; int top; //栈顶 }SeqStack,*PSeqStack; void BFS_path(MGraph *G,int u,int v) //深度优先遍历 从状态下标u到状态下标v { int i,j,m,n; PSeqStack S; S=Init_SeqStack(); Push_SeqStack(S,v); visited[u]=TRUE; //改变路径头结点的访问标志为TRUE Push_SeqStack(S,u); while(!Empty_SeqStack(S)) { Pop_SeqStack(S,&u); m=1; for(i=0;i<G->vertexNum;i++) //判定后继结点的个数及将其后继结点访问标志置TRUE { if(G->edges[u][i] && !visited[i]) { path[u][m]=i; //将下标为U的后继结点下标赋给path[u][m] m用来记录直接后继结点的个数 visited[i]=TRUE; m++; } } for(j=1;j<=m;j++) { n=path[u][j]; if(n!=v) //判断结束标志 如果数的后继结点下标与要找的一条路径最后一个结点的下标不一样 则将后继元素下标入栈 Push_SeqStack(S,n); else //或者将栈中的最后一个元素出栈 Pop_SeqStack(S,&u); } while(Size_SeqStack(S)>2) //栈中元素个数大于2 则一直出栈 { Pop_SeqStack(S,&u); m=1; for(i=0;i<G->vertexNum;i++) { if(G->edges[u][i] && !visited[i]) //path[u][m] 为状态下标u的直接后继状态下标 m表示状态下标u的后继结点个数 { path[u][m]=i; visited[i]=TRUE; m++; } } } } Destroy_SeqStack(&S); //销毁栈 } void print_path(MGraph *G,int u,int v) //输出所有从状态下标为u到状态下标为v的所有简单路径 { int n,k,i,j,m,t,a,l; k=u; j=1; visited[u]=FALSE; //改变第一个结点的访问标志 path[v][1]=-1; //将一条路径的最后一个顶点的后继结点下标置为无穷大 while(k!=-1) { printf("\t\tNO%d:(%d,%d,%d,%d)\n",j++,G->vertex[k].farmer,G->vertex[k].wolf,G->vertex[k].sheep,G->vertex[k].vegetable); m=CountAdjoin(G,k); if(m==0) //结束条件 后继结点个数为零 break; if(m!=1) { for(i=m;i>0;i--) //输出某个结点后的所有分支后继结点 { t=k; t=path[t][i]; n=0; l=j; while(t!=-1) { if(n<=1) //(某个结点分支后继结点个数)//用于转换输出另外一条分支后继结点的判断条件 { printf("\tNO%d:(%d,%d,%d,%d)",l++,G->vertex[t].farmer,G->vertex[t].wolf,G->vertex[t].sheep,G->vertex[t].vegetable); a=t; t=path[t][1]; visited[t]=FALSE; n++; } else break; } printf("\n"); } j=l; k=a; } k=path[k][1]; } } 3:实验结果 结果分析: 农夫过河的安全步骤: NO1:农夫,狼,羊,白菜都在河的左岸 NO2:农夫带羊到河的右岸 NO3:农夫回到河的左岸 NO4:农夫带狼到河的右岸 或者 农夫带白菜到河的右岸 NO5:农夫带羊回到河的左岸 或者 农夫带羊回到河的左岸 NO6:农夫带狼到河的右岸 NO7:农夫回到河的左岸 NO8:农夫带羊到和的右岸 4:实验心得 通过农夫过河的实验,使我初步了解解决一些复杂较难问题的思路和掌握了解决问题的方法。通过该实验的代码编程过程中也进一步提高了我对c语言的掌握,掌握了栈,深度广度遍历的算法,也提高了我对算法的学习设计能力,同时提高了编程调试的能力,使我遇到那些逻辑上的错误,能通过自己一点一点的调试,搜寻逻辑错误所在处。在编程调试中遇相关的问题时,让我明白遇到问题不可怕,怕的是遇到问题不想解决或者没有解决问题恒定的决心,即使一些问题在困难,当时对遇到的可能丝毫没有头绪,只要一点点的对问题剖析,哪怕在困难的问题也会被解决。 实验二 1:实验要求: 1.1:实验目的 提高分析设计解决问题的能力,并掌握选择策略的图的深度优先搜索等先关的知识。 1.2:实验内容问题描述 马随机放在国际象棋8*8的方格中,马按照走马的规则进行移动,要求马走过每个格走过仅走过一次并且每个格都走过,编程求输出马走过的路径 1.3: 实验输出 输出骑士周游的路径 2:程序设计分析 2.1:实验内容分析 在国际象棋的棋盘上,马共有八个可能的跳跃方向。 设置一组坐标增量来描述这八个条约方向: ① (1,2)      ② (2,1) ③ (2,-1)     ④ (1,-2) ⑤ (-1,-2)    ⑥ (-2,-1)  ⑦ (-2,1)     ⑧ (-1,2) 2.2:主要算法模块分析 void go(int n,int x,int y) 递归算法模块 2.3: 主要源代码 #include <stdio.h> #define N 8 int ditu[N][N] = //棋盘初始化所有点为零 { {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0} }; int path[N][N]; //记录周游路径 int flag=0; //结束标记 int incX[]={1,2,2,1,-1,-2,-2,-1}; //指示方向 横坐标 int incY[]={-2,-1,1,2,2,1,-1,-2}; //指示方向 纵坐标 void go(int n,int x,int y) { if (n>=(N*N)) //判断是否走完整个地图 { flag=1; path[x][y]=n; } if (flag==1) //递归结束标志 return; path[x][y]=n; //将骑士走的路径记录 ditu[x][y]=1; //标记坐标(x,y)点走过 for (int i=0;i<8;i++) //8方向探路 if ((((x+incX[i])>=0) && ((x+incX[i])<N)) && (((y+incY[i])>=0) && ((y+incY[i])<N)) && (ditu[x+incX[i]][y+incY[i]]==0)) go(n+1,x+incX[i],y+incY[i]); //递归周游 ditu[x][y] = 0; //8个方向中 如果探测方向不是合适的落马点 则清除马走过的标记 return; } void main() { printf("骑士从棋盘左上角开始的周游路径\n"); go(1,0,0); //设置从0,0开始出发 for(int i=0;i<N;i++) //输出路径 { for(int j=0;j<N;j++) { printf("%4d",path[i][j]); } printf("\n"); } } 3:实验结果 4:实验心得 通过该实验让我掌握了数据结构进一步了解,对图的深度优先遍历算法的由来更深的理解与体会,对骑士周游问题有自己的见解和体会。让我学习的理论与实际运用相结合,提高了独立解决问题的能力。 收集于网络,如有侵权请联系管理员删除
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:农夫过河和骑士周游(数据结构课程设计)教学文案.doc
    链接地址:https://www.zixin.com.cn/doc/3696671.html
    页脚通栏广告

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork