农夫过河报告(最终版)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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++)
{