狼羊白菜实验报告

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

南京邮电大学通达学院程序设计(上机)报告
题目:R004M,P005H
专业网络工程
学生姓名
班级学号
指导教师
日期
评分细则
评分项优秀良好中等及格不及格遵守机房规章制度
上机表现
学习态度
基础知识水平
程序设计能力
课题功能实现情况
算法设计合理性
用户界面友好性
报告书写认真程度
报告内容完整性
文字表达清楚程度
问题回答准确性

分等级教师签名:
年月日


注:评分等级分为五种:优秀、良好、中等、及格、不及格
狼羊白菜过河程序实验报告
一.问题描述
一个人带着一只羊,一条狼和一颗白菜想过河,假设他每次只能带一只羊,或者一条狼,或者一颗白菜过河,并限定人不在场时,狼和羊,或羊和白菜不能单独在一起,试编写程序求出他带一只羊,一条狼和一颗白菜过河的办法。

二.结构图
三、结构设计
1、 狼和羊、羊和白菜不能单独在一起,涉及对象较多,而且运算步骤方法较为复杂,要用程序语言实现,需要将具体实例数字化。

针对实现整个过程需要多步,不同步骤中各个事物所处位置不同的情况,可定义一个二维数组或者结构体来实现对四个对象狼、羊、白菜和一个人的表示。

对于岸的两侧可以用0或者1来表示,以实现在程序设计中的简便性。

2、对狼羊白菜的过河步骤,没有顺序的约束,因此需要给各个事物依次进行编号,然后依次尝试,若成功,进行下一步,使用循环或者递归算法进行程序
3、程序使用递归算法,为了方便将各个实例数字化。

定义二维数组int a[M][4]存储每一步中各个对象所处的位置,用0-3分别表示二维数组的一维下标。

具体对应为:wolf-0 goat-1 cabbage-2 people-3
将本岸和对岸数字化,其对应为:本(东)岸-0 对(西)岸-1
具体对应实例比如在第3步之后狼在本岸,羊在对岸,白菜在本岸,农夫在对岸,则其存储结果为:
a[3][0] a[3][1] a[3][2] a[3][3]
过河
农夫选择
相斥共存
程序运行
输出结果
0 1 0 1
最初存储状态为:a[0][0] a[0][1] a[0][2] a[0][3]
0 0 0 0
成功渡河之后,二维数组存储应为:
a[istep][0] a[istep][1] a[istep][2] a[istep][3]
1 1 1 1
因此a[iStep][0] + a[iStep][1] + a[iStep][2] + a[iStep][3] == 4。

题目要求狼和羊、羊和白菜不能在一起,即出现以下情况:
a[iStep][1] != a[iStep][3] && (a[iStep][2] == a[iStep][1] || a[iStep][0] == a[iStep][1])则出现错误,应返回操作。

开始
a[0][0]=0,a[0][1]=0
,a[0][2]=0,a[0][3]=
递归
结束
同时定义一维数组b[M]来存储每一步中人是如何过河的。

设计程序中实现递归操作部分的核心程序为:
for(i=-1;i<=2;i++)
{b[iStep] = i;
memcpy(a[iStep+1],a[iStep],16); a[iStep+1][3]=1-a[iStep+1][3];
if(i==-1)
{
search(iStep+1);
}
else if(a[iStep][i] == a[iStep][3])
{a[iStep+1][i] = a[iStep+1][3];
search(iStep+1);
}
}
每次循环从-1到2依次代表渡河时为一人、带狼、带羊、带白菜通过,利用语句“b[iStep] = i”分别记录每一步中渡河方式,“a[iStep + 1][i] = a[iStep + 1][3]”即利用赋值方式使狼或羊或白菜与人一同到对岸或者回到本岸。

若渡河成功,则依次输出渡河方式。

“i<=2”即为操作的限制,当若i=2时仍无符合条件的方式,则渡河失败。

在递归的过程中每进行一步都需要判断是否需要继续进行此次操作,具体的判断为:(1)若该步骤能使各值均为1,则渡河成功,输出结果。

if(a[iStep][0]+a[iStep][1]+a[iStep][2]+a[iStep][3]==4){…… return} (2)若该步与以前步骤相同,返回操作。

if(memcmp(a[i],a[iStep],16)==0) { return;}
(3)若羊和人不在一块而狼和羊或者羊和白菜在一块,则返回操作。

if(a[iStep][1]!=a[iStep][3]&&(a[iStep][2]==a[iStep][1]||a[iStep][0]
== a[iStep][1])) {return;}
四、处理流程图:
Y
Y
N
Y
N
Y
N
N
Y
search (iStep )
人狼羊白菜
在本岸
狼羊白菜单独在一起? 输出解决方案 return
此状态态与前面相同? i=-1
i <=2? i++ 结束
五、源程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 10
int a[M][4];
int b[M];
char *name[] = {" ","and wolf","and goat","and cabbage"}; void search(int iStep)
{
int i;
if (a[iStep][0] + a[iStep][1] + a[iStep][2] + a[iStep][3] == 4) {for (i=0;i<=iStep;i++)
{printf("本岸: ");
if(a[i][0]==0)
printf("wolf");
if(a[i][1]==0)
printf("goat");
if(a[i][2]==0)
printf("cabbage");
if(a[i][3]==0)
printf("people");
if(a[i][0]&&a[i][1]&&a[i][2]&&a[i][3])
printf("none");
printf(" ");
printf("对岸: ");
if(a[i][0]==1)
printf("wolf");
if(a[i][1]==1)
printf("goat");
if(a[i][2]==1)
printf("cabbage");
if(a[i][3]==1)
printf("people");
if(!(a[i][0]||a[i][1]||a[i][2]||a[i][3])) printf("none");
printf("\n\n\n");
if(i<iStep)
printf("the %d time\n",i+1);
if(i>0&&i<iStep)
{if (a[i][3]==0)
{printf("------>people");
printf("%s\n",name[b[i]+1]);
}
else {printf("<-----people ");
printf("%s\n",name[b[i]+1]);
}
}
}
printf("\n\n\n\n");
return;
}
for(i=0;i< iStep;i++)
{if (memcmp(a[i],a[iStep],20)==0)
{return;
}
}
if (a[iStep][1] != a[iStep][3] && (a[iStep][2] == a[iStep][1] || a[iStep][0] == a[iStep][1])) {
return;
}
for (i = -1; i <= 2; i++)
{
b[iStep] = i;
memcpy(a[iStep + 1], a[iStep], sizeof(a[iStep + 1]));
a[iStep + 1][3] = 1 - a[iStep + 1][3];
if (i == -1)
{
search(iStep + 1);
}
else if (a[iStep][i] == a[iStep][3])
{
a[iStep + 1][i] = a[iStep + 1][3];
search(iStep + 1);
}
}
}
int main()
{printf("\n\n人过河问题解决方案如下:\n\n\n");
search(0);
return 0;
}
六、程序测试记录
第一次:
Wolfgoatcabbbagepeople none
The 1 time
Wolfcabbage goatpeople
The 2 time
Wolfcabbagepeople goat
The 3 time
Cabbage wolfgoatpeople
The 4 time
Goatcabbagepeople wolf
The 5 time
Goat wolfcabbagepeople ...............
第二次:
Wolfgoatcabbbagepeople none
The 1 time
Wolfcabbage goatpeople
The 2 time
<------people
Wolfcabbagepeople goat
The 3 time
-------->peopleand wolf
Cabbage wolfgoatpeople
The 4 time
<-------peopleand goat Goatcabbagepeople wolf
The 5 time
------>peopleand cabbage
Goat wolfcabbagepeople
The 6 time
<-------peopleand goat
Wolfgoatpeople cabbage
The 7 time
-------->peopleand wolf
Goat wolfcabbagepeople
The 8 time
<-------people
Goatpeople wolfcabbage
The 9 time
--------->peopleand goat
None wolfgoatcabbagepeople
Press any key to continue
第三次:
本岸:Wolfgoatcabbbagepeople 对岸:none The 1 time
本岸:Wolfcabbage 对岸:goatpeople
The 2 time
<------people
本岸:Wolfcabbagepeople 对岸:goat
The 3 time
-------->peopleand wolf
本岸:Cabbage 对岸:wolfgoatpeople The 4 time
<-------peopleand goat
本岸:Goatcabbagepeople 对岸:wolf
The 5 time
------>peopleand cabbage
本岸:Goat 对岸:wolfcabbagepeople
The 6 time
<-------peopleand goat
本岸:Wolfgoatpeople 对岸:cabbage The 7 time
-------->peopleand wolf
本岸:Goat 对岸:wolfcabbagepeople
The 8 time
<-------people
本岸:Goatpeople 对岸:wolfcabbage The 9 time
--------->peopleand goat
本岸:None 对岸:wolfgoatcabbagepeople
Press any key to continue
第四次:
人过河问题解决方案如下:
本岸:Wolfgoatcabbbagepeople 对岸:none The 1 time
本岸:Wolfcabbage 对岸:goatpeople
The 2 time
<------people
本岸:Wolfcabbagepeople 对岸:goat
The 3 time
-------->peopleand wolf
本岸:Cabbage 对岸:wolfgoatpeople The 4 time
<-------peopleand goat
本岸:Goatcabbagepeople 对岸:wolf
The 5 time
------>peopleand cabbage
本岸:Goat 对岸:wolfcabbagepeople
The 6 time
<------people
本岸:Goatpeople 对岸:wolfcabbage
The 7 time
-------->peopleandgoat
本岸:None 对岸:wolfgoatcabbagepeople
本岸:Wolfgoatcabbbagepeople 对岸:none The 1 time
本岸:Wolfcabbage 对岸:goatpeople
The 2 time
<------people
本岸:Wolfcabbagepeople 对岸:goat
The 3 time
-------->peopleand cabbage
本岸:wolf 对岸:goatcabbagepeople
The 4 time
<-------peopleand goat
本岸:wolfgoatpeople 对岸:cabbagae
The 5 time
------>peopleand wolf
本岸:Goat 对岸:wolfcabbagepeople
The 6 time
<------people
本岸:Goatpeople 对岸:wolfcabbage
The 7 time
-------->peopleandgoat
本岸:None 对岸:wolfgoatcabbagepeople
Press any key to continue
七、相关运行界面
八、调试记录
(1)在最初的时候没有printf("本岸: ");printf("对岸: ");使得输出的程序看起来不清晰易懂,于是进行修改调试。

(2)if(i>0&&i<iStep) {if(a[i][3]==0){printf("------>people");printf("%s\n",name[b[i]+1]);
}else {printf("<-----people ");printf("%s\n",name[b[i]+1])} }时没有结果的输出,程序有问题,在同学的帮助之下得以修改。

(3)当if (memcmp(a[i],a[iStep],20)==0){return;}此处的程序中,数字大于等于十七时会出现M-1个步骤,其中的M-9个步骤是人来回过河,做的无用功。

当数字在13~16之间时会出现两种有效的步骤,并且其中无无用功的过河,当小于13时则不能出现程序的调试结果。

(4)对#define M 10进行宏定义时要确定好M的大小范围,以免做无用功,经调试得出如图结果。

最终是两种过河的有效方法,但是调试的结果不那么的美观进行了优化界面。

加上了printf("\n\n人过河问题解决方案如下:\n\n\n");得出一下较优化的程序运行界面。

九、课程设计总结:
通过本次的课程程序设计,应用VC++6.0软件进行程序的调试验证,把学习过的C语言知识进行了实践,对知识还进行了进一步的掌握,同时加深了对VC++6.0软件的熟练程度。

对于设计这个狼羊白菜人过河的程序的设计,运用了if选择语句和递归调用的程序结构。

通过一次一次的调试使得结果更加的清晰明了,并且运行的界面美观化,具体的程序细节还要精心的琢磨推敲,通过上机的运行对知识有了多角度的理解与体会,两周的忙碌努力还有一定的收获,会更加的努力。

相关文档
最新文档