实践报告Word格式.docx
《实践报告Word格式.docx》由会员分享,可在线阅读,更多相关《实践报告Word格式.docx(9页珍藏版)》请在冰豆网上搜索。
1305500227
网络工程
信息学院计算机科学与技术系
向新银
日期:
2015年1月18日
实验实训教学管理中心制
实践教学开展时间
2015年1月10日—2015年1月23日
实践形式(在选项后打√)
集中
分散
√
实践单位或地点
陕西省安康市旬阳县
本校
指导教师
向新银
职称
讲师
二级
学院、系
信息学院计算机科学与技术系
实践内容及收获
本次实践我主要针对顺序表在农夫过河问题中的应用(尤其是栈和队列在解决实际问题中所起到的不容小觑的作用)进行了一系列研究学习。
通过此次实践,我深刻感受到数据结构对计算机系学生的重要性以及它在解决诸多实际问题中的强大功能,并且切身感受到了实践对一个大学生的帮助与影响远超过纯粹的课堂学习,当然,两者是相辅相成的,只有掌握了理论知识,才能更好地应用于实践,所谓实践出真知便是实践对于大学生的真正意义所在。
成绩
评定
(综合评语)
成绩:
指导教师签字:
、
年月日
系意见
签字(盖章):
二级学院意见
顺序表在农夫过河问题中的应用
一、问题描述
设一个农夫过河带着一条狼、一只羊和一棵白菜,身处河的南岸。
现在他要把这些西全部运到北岸,现在问题是他面前只有一条小船,船小到只能容下他和一件物品,另外只有农夫能撑船。
当农夫在场的时候,这三样东西相安无事.一旦农夫不在,狼会吃羊,羊会吃白菜。
根据原题的描述我们知道,单独留下白菜和羊,或单独留下狼和羊在某一岸的状态是不安全的。
白菜和狼相处没事,把它看作个重要关系的,通过位置分布的代码来判断状态是否安全。
然后设计一个方案,模拟农夫能安全地将这三样东西带过河。
二.基本要求
以队列解决农夫过河问题,用广度优先搜索实现求解的过程。
用这个方法来搜索过程中总是首先搜索下面一步的所有可能状态,然后再进一步考虑更后面的各种情况。
要实现广度优先搜索,一般都采用队列作为辅助结构。
把下一步所有可能达到的状态都列举出来,放在这个队列中,然后顺序取出来分别进行处理,处理过程中把再下一步的状态放在队列里。
由于队列的操作遵循先进先出的原则,在这个处理过程中,只有在前一步的所有情况都处理完后,才能开始后面一步各情况的处理。
为了实现广度优先搜索,算法中需要使用一个整数队列moveTo,它的每个元素表示一个可以安全到达的中间状态。
另外还需要一个数据结构记录已被访问过的各个状态,以及已被发现的能够到达当前这个状态的路径。
由于在这个问题的解决过程中需要列举的所有状态(二进制0000~1111)一共16种,所以可以构造一个包含16个元素的整数顺序表来满足以上的要求。
三.测试数据
要模拟农夫过河问题,首先需要选择一个对问题中每个角色的位置进行描述的方法。
一个很方便的办法是用四位二进制数顺序分别表示农夫、狼、白菜和羊的位置。
例如用0表示农夫或者某东西在河的南岸,1表示在河的北岸。
因此整数5(其二进制表示为0101)表示农夫和白菜在河的南岸,而狼和羊在北岸。
确定每个角色位置的函数,用整数location表示上述四位二进制描述的状态,用下面的四个函数从上述状态中得到每个角色所在位置的代码。
函数返回值为真表示所考察的人或物在河的北岸,否则在南岸。
从初始状态二进制0000(全部在河的南岸)出发,寻找一种全部由安全状态构成的状态序列,它以二进制1111(全部到达河的北岸)为最终目标,并且在序列中的每一个状态都可以从前一状态通过农夫(可以带一样东西)划船过河的动作到达。
四.流程
代码如下:
/*用队列解决农夫过河问题的算法*/
#include<
stdio.h>
stdlib.h>
#defineMAXNUM20
typedefintDataType;
structSeqQueue
{/*顺序队列类型定义*/
intf,r;
DataTypeq[MAXNUM];
};
typedefstructSeqQueue*PSeqQueue;
/*顺序队列类型的指针类型*/
PSeqQueuecreateEmptyQueue_seq(void)
{
PSeqQueuepaqu=(PSeqQueue)malloc(sizeof(structSeqQueue));
if(paqu==NULL)
printf("
Outofspace!
!
\n"
);
else
paqu->
f=paqu->
r=0;
return(paqu);
}
intisEmptyQueue_seq(PSeqQueuepaqu)
returnpaqu->
f==paqu->
r;
/*在队列中插入一元素x*/
voidenQueue_seq(PSeqQueuepaqu,DataTypex)
if((paqu->
r+1)%MAXNUM==paqu->
f)
printf("
Fullqueue.\n"
);
else
q[paqu->
r]=x;
r=(paqu->
r+1)%MAXNUM;
}
/*删除队列头部元素*/
voiddeQueue_seq(PSeqQueuepaqu)
if(paqu->
r)
EmptyQueue.\n"
f=(paqu->
f+1)%MAXNUM;
/*对非空队列,求队列头部元素*/
DataTypefrontQueue_seq(PSeqQueuepaqu)
return(paqu->
f]);
intfarmer(intlocation)
return0!
=(location&
0x08);
intwolf(intlocation)
0x04);
intcabbage(intlocation)
0x02);
intgoat(intlocation)
=(location&
0x01);
/*若状态安全则返回true*/
intsafe(intlocation)
/*羊吃白菜*/
if((goat(location)==cabbage(location))&
&
(goat(location)!
=farmer(location)))
return0;
/*狼吃羊*/
if((goat(location)==wolf(location))&
=farmer(location)))
return1;
/*其他状态是安全的*/
voidfarmerProblem()
intmovers,i,location,newlocation;
introute[16];
/*记录已考虑的状态路径*/
PSeqQueuemoveTo;
/*准备初值*/
moveTo=createEmptyQueue_seq();
enQueue_seq(moveTo,0x00);
for(i=0;
i<
16;
i++)route[i]=-1;
route[0]=0;
/*开始移动*/
while(!
isEmptyQueue_seq(moveTo)&
(route[15]==-1))
/*得到现在的状态*/
location=frontQueue_seq(moveTo);
deQueue_seq(moveTo);
for(movers=1;
movers<
=8;
<
=1)
/*农夫总是在移动,随农夫移动的也只能是在农夫同侧的东西*/
if((0!
0x08))==(0!
movers)))
newlocation=location^(0x08|movers);
if(safe(newlocation)&
(route[newlocation]==-1))
route[newlocation]=location;
enQueue_seq(moveTo,newlocation);
/*打印出路径*/
if(route[15]!
=-1)
Thereversepathis:
for(location=15;
location>
=0;
location=route[location])
Thelocationis:
%d\n"
location);
if(location==0)return;
Nosolution.\n"
intmain()
farmerProblem();
截图:
五、测试结果
程序输出按相反的变化方向输出的,真实的情况应该是从0、9、……、15变化的。
六、总结和体会
这个程序还有很大的改进空间,首先是人性化方面的设计,这个程序最终的输出结果是用10进制的,而我们需要知道的应该是二进制的结果,所以应该直接把结果输出为二进制,还要按开始到最终状态的排序输出。
还有一种更为人性化的设计,就是把对应的每个二进制代码代表的含义直接用中文表示出来,这样的结果更直观,方便用户使用。
例如:
0000时,程序输出:
所有的物品都在南岸。
后面的一个状态是9(1001),程序输出:
农夫和羊到了北岸。
通过这个程序的学习,我很受启发,这次实践让我明白了如何用计算机解决实际生活中的问题。
刚开始看到这个题目时,感觉相当困难,因为这种题以前是考验我们的IQ用的,没想到现在要用计算机来解决,而且计算机又没有思想,怎样让它想问题,实现我们需要的、理想的功能?
通过查找相关资料,我找到了解决这个问题的有效方法。
原来,我们可以把实际的问题转化为数学模型,通过计算机超强悍的循环功能和强大的数据处理能力,把所有可能的结果都计算出来,然后用约束项来对这些结果进行筛选,最后把结果用数学格式来输出,使问题得以求解。
这个程序的设计方法比较巧妙的地方是数学建模,即每个角色的位置进行描述的方法:
用四位二进制数顺序分别表示农夫、狼、白菜和羊的位置。
例如用0表示农夫或者某东西在河的南岸,1表示在河的北岸,因此整数5(其二进制表示为0101)
表示农夫和白菜在河的南岸,而狼和羊在北岸。
这个方法令人拍案叫绝,在佩服人类智慧的同时,计算机运用数据结构所呈现出来的强大的解决实际问题的能力也使我深深折服。
这也时刻提醒我在以后的学习中,更加用心,更加努力,万不可因惰性而懈怠,良好的专业素养是一个合格的计算机系学生所必备的“软能力”。
认真学习专业知识,逐渐找到合适自己的专业方向是今后学习中的重中之重,培养和锻炼企业所需人才的各种能力,为毕业后找到一份满意的工作积蓄能量,相信只要锲而不舍地坚持下去,梦想定会如期而至!