数据结构课程设计修道士野人问题和西文图书管理系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题号题目3、修道士与野人问题

1、需求分析

n个修道士和n个野人渡河,只有一条小船,能容纳c人,两种人都会划船,建立过河方式。满足:

野人无法侵犯修道士。这就要求无论在何处,修道士的个数不得少于野人的人数(除非修道士个数为0)。设计程序模拟该过程。

程序的输入为修道士(野人)的个数以及每条船容纳人的个数。输出为判断是否可以安全渡河。如果能,则给出一个小船来回次数最少的最佳方案。

要求:

(1)用一个三元组(x1,x2,x3)表示渡河过程中各个状态。其中,x1表示起始岸上修道士个数,x2表示起始岸上野人个数,x3表示小船位置(0——在目的岸,1——在起始岸)。例如(5,3,0)表示起始岸上有5个修道士,3个野人,小船在目的岸一边。

(2)采用邻接表做为存储结构。最短路径搜索采用广度搜索法。

(3)输出最优解

若问题有解(能渡过河去),则输出一个最佳方案。用三元组表示渡河过程中的状态,并用箭头指出这些状态之间的迁移:

目的状态←…中间状态←…初始状态。

若问题无解,则给出“渡河失败”的信息。

(4)求出所有的解。

2、设计

设计思想

(1)数据结构设计:根据题目要求,用图形结构,用邻接表来存储结点,以及结点之间的关系,同时在广度优先遍历中利用到队列。

(2)算法设计:先定义一个图利用邻接表储存结构,再举出在船上修道士和野人的所有情况,然后判断其修道士是否处于安全的状态,如果安全则将该点添加到图中,点添加完后在看两点之间是否连通如果连通则可将边添加到图中,这样就创建出了图,然后分别利用广度搜索和深度搜索来完成题目的要求。

(1

(2)函数接口规则说明

int Search(AdjLGraph *G,int x,int y,int m ) /*查找起始和最后的结点,其中x,y,m分别表示起始岸修道士人数,野人人数和船的状态*/

int Checking(DataType x) /*检查修道士是否安全,x表示邻接表中的一个结点*/

int Connect(AdjLGraph *G,int i,int j) /*将能走通的点连接起来,i,j为图中的两个结点*/ void Creat(AdjLGraph *G) /*图的创建*/

int Print(AdjLGraph G) /*从后向前打印最短路径*/

int BroadFSearch(AdjLGraph G,int u,int v) /*用广度优先遍历搜索最短路径,u表示起始结点,v表示最后的结点*/

void Print1(AdjLGraph G) /*打印输出所有最短路径*/

void DFS(AdjLGraph G,int u,int v ,int visited[]) /*利用深度搜索找出所有最短路径,u表示起始结点,v表示最后的结点,visited[]用来标记结点是否被访问*/

详细设计

首先是定义邻接表

typedef struct

{

int daoshi;

ource=i;

G->a[i].adj=NULL;

}

}

void InsertVertex(AdjLGraph *G,int i,DataType x) ;;;dj;dj=p;

G->numOfEdges++;

}

void AdjDestroy(AdjLGraph *G)dj;

while(p!=NULL)

{

q=p->next;

free(p);

}

}

}

=x&&G->a[i].==y

&&G->a[i].==m)

return i;

return -1;

}

int Checking(DataType x)a[j].+(G->a[i].>a[j].;

if(G->a[i].==0&&G->a[j].==0||G->a[i].==1&&G->a[j].==1) return 0;

=1&&G->a[j].==0) G->a[i].||G->a[j].>G->a[i].

=G->a[i].&&G->a[j].==G->a[i].

return 0;

if(m>c)return 0;=0&&G->a[j].==1)

{

G->a[i].||G->a[j].a[i].

=G->a[i].&&G->a[j].==G->a[i].

return 0;

if((-1)*m>n)return 0;[v2].,[v2].;

for(k=Path1[v2];k!=v1;k=Path1[k])

{

i++;

printf("(%d %d %d)<------",[k].,[k].,[k].;

}

printf("(%d %d %d)\n",[v1].,[v1].,[v1].;

return i;

}

dj;

while(p!=NULL)

{

z=p->dest;

if(z==v)

{

Path1[z]=w;ata;

a1[i+1]=[k].data;

i++;

}

if(i==M)

a1[i+1]=[v2].data;

N++;

printf("(%d %d %d)",[v1].,[v1].,[v1].;

for(j=1;j<=M+1;j++)

{

printf("-->(%d %d)-->(%d %d %d)",abs(a1[j].daoshi-a1[j-1].daoshi),abs(a1[j].yeren-a1[j-1].yer en),a1[j].daoshi,a1[j].yeren,a1[j].ship);

}

printf("\n");

}

}

dj;

while(p!=NULL)

{

w=p->dest;

if(w==v) {

Path[u]=w;Main () Inputku() Lookku() Lend() Returnbook() Output() Clearku()

Exit(0)

SearchBTree() InsertNode() B-树

相关文档
最新文档