文档详情

农夫过河和骑士周游(数据结构课程设计).doc

发布:2019-08-05约5.95千字共11页下载文档
文本预览下载声明
PAGE 11 姓名:高明 学号: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); vis
显示全部
相似文档