农夫过河报告(最终版)

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

这最起码是一个报

告,虽然我尽力的

看,终究还是看不

懂。

农夫过河算法实验报告

——数据结构项目课研究课题

组长:崔俊

组员:李琦、郑鸿飞、王琅辉、张育博

15.12.29

摘要

农夫过河问题是应用广度优先搜索和深度优先搜索的典型问题,但这里我们应用了简单的数组,通过层层筛选的手段也解决了同样的问题,其中用到了部分广度优先搜索的思想。

前言

农夫过河问题描述:一个农夫带着—只狼、一只羊和—棵白菜,身处河的南岸。他要把这些东西全部运到北岸。他面前只有一条小船,船只能容下他和—件物品,另外只有农夫才能撑船。如果农夫在场,则狼不能吃羊,羊不能吃白菜,否则狼会吃羊,羊会吃白菜,所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,而狼不吃白菜。请求出农夫将所有的东西运过河的方案。

正文

1.问题抽象和数据组织

农夫过河问题应该应用图的广度优先遍历或者深度优先遍历,但这里我们仅使用简单的线性表——数组,通过多重的条件限制,达成目的。这里我们同样用0和1代表农夫、狼、羊、白菜在左岸还是在右岸,并规定0在左,1在右,我们的目的便是从0000通过一系列变换到1111。

2.农夫过河算法源代码

#include

#define MAX 16

typedef struct FWSV

{

int farmer;

int wolf;

int sheep;

int vegetable;

}Item;

//函数原型

//操作:筛选符合条件的安全的数组成员

//操作前:无

//操作后:返回安全数组的指针

void screen(void);

//操作:判断下一个数应该取安全数组中那个数

//操作前: 传递一个结构体数组成员

//操作后:返回另一个结构体数组指针

Item * judge(Item Fwsv);

Item safe[MAX];

int k = 0; //用于计数safe[]中的总数

int main (void)

{

screen();

Item * next;

Item first,second,end;

first = safe[0];

end = safe[k];

printf("first:0000\n");

next = judge(first);

for (int count = 0;count <= 6;count++)

{

if (next->farmer + next->wolf + next->sheep + next->vegetable != 0)

{

second = *next;

next = judge(second);

}

else

next++;

}

printf("end:1111\n");

return 0;

}

void screen(void)

{

int f = 0,w = 0,s = 0,v = 0;

for(f = 0;f < 2;f++)

{

for(w = 0;w < 2;w++)

{

for(s = 0;s < 2;s++)

{

for(v = 0;v < 2;v++)

{

if (!(f != s && (s == w || s == v)))

{

safe[k].farmer = f;

safe[k].wolf = w;

safe[k].sheep = s;

safe[k].vegetable = v;

k++;

}

}

}

}

}

}

Item * judge(Item Fwsv)

{

Item * next;

Item compare[4];

next = compare;

int x1 = 0;

int sum = 0;

if (Fwsv.farmer == 0)

{

for (int x = 0;x < k;x++)

{

//把出现过的置零操作

if(safe[x].farmer == Fwsv.farmer && safe[x].wolf == Fwsv.wolf && safe[x].sheep == Fwsv.sheep && safe[x].vegetable == Fwsv.vegetable )

{

safe[x].farmer = 0;

safe[x].wolf = 0;

safe[x].sheep = 0;

safe[x].vegetable = 0;

}

//筛选出农夫状态值与之前相反的 1变0 0变1

if(safe[x].farmer == 1 && (safe[x].farmer + safe[x].wolf + safe[x].sheep + safe[x].vegetable != 4 ))

{

compare[x1] = safe[x];

x1++;

}

}

for (int x2 = 0;x2 < 4;x2++)

{

相关文档
最新文档