农夫过河问题

合集下载

数据结构实验-农夫过河问题

数据结构实验-农夫过河问题

农夫过河问题一、实验目的掌握广度优先搜索策略,并用队列求解农夫过河问题二、实验内容问题描述:一农夫带着一只狼,一只羊和一颗白菜,身处河的南岸,他要把这些东西全部运到北岸,遗憾的是他只有一只小船,小船只能容下他和一件物品。

这里只能是农夫来撑船,同时因为狼吃羊、羊吃白菜、所以农夫不能留下羊和狼或羊和白菜在河的一边,而自己离开;好在狼属肉食动物,不吃白菜。

农夫怎么才能把所有的东西安全运过河呢?实验要求如下:(1)设计物品位置的表示方法和安全判断算法;(2)设计队列的存储结构并实现队列的基本操作(建立空队列、判空、入队、出队、取对头元素),也可以使用STL中的队列进行代码的编写;(3)采用广度优先策略设计可行的过河算法;(4)输出要求:按照顺序输出一种可行的过河方案;提示:可以使用STL中的队列进行代码编写。

程序运行结果:二进制表示:1111011011100010101100011001,0000三、农夫过河算法流程⏹Step1:初始状态0000入队⏹Step2:当队列不空且没有到达结束状态1111时,循环以下操作:⏹队头状态出队⏹按照农夫一个人走、农夫分别带上三个物品走,循环以下操作:⏹农夫和物品如果在同一岸,则计算新的状态⏹如果新状态是安全的并且是没有处理过的,则更新path[ ],并将新状态入队⏹当状态为1111时,逆向输出path[ ]数组附录一:STL中队列的使用注:队列,可直接用标准模板库(STL)中的队列。

需要#include<queue>STL中的queue,里面的一些成员函数如下(具体可以查找msdn,搜索queue class):front:Returns a reference to the first element at the front of the queue.pop:Removes an element from the front of the queuepush:Adds an element to the back of the queueempty:Tests if the queue is empty三、实验代码FarmerRiver.H#ifndef FARMERRIVER_H#define FARMERRIVER_Hint FarmerOnRight(int status); //农夫,在北岸返回1,否则返回0int WorfOnRight(int status); //狼int CabbageOnRight(int status); //白菜int GoatOnRight(int status); //羊int IsSafe(int status); //判断状态是否安全,安全返回1,否则返回0void FarmerRiver();#endifSeqQueue.h#ifndef SEQQUEUE_H#define SEQQUEUE_Htypedef int DataType;struct Queue{int Max;int f;int r;DataType *elem;};typedef struct Queue *SeqQueue;SeqQueue SetNullQueue_seq(int m);int IsNullQueue_seq(SeqQueue squeue);void EnQueue_seq(SeqQueue squeue, DataType x);void DeQueue_seq(SeqQueue);DataType FrontQueue_seq(SeqQueue);#endifFarmerRiver.c#include <stdio.h>#include <stdlib.h>#include "SeqQueue.h"#include "FarmerRiver.h"int FarmerOnRight(int status) //判断当前状态下农夫是否在北岸{return (0!=(status & 0x08));}int WorfOnRight(int status){return (0!=(status & 0x04));}int CabbageOnRight(int status){return (0!=(status & 0x02));}int GoatOnRight(int status){return (0!=(status & 0x01));}int IsSafe(int status) //判断当前状态是否安全{if ((GoatOnRight(status)==CabbageOnRight(status)) &&(GoatOnRight(status)!=FarmerOnRight(status)))return (0); //羊吃白菜if ((GoatOnRight(status)==WorfOnRight(status)) && (GoatOnRight(status)!=FarmerOnRight(status))) return 0; //狼吃羊return 1; //其他状态是安全的}void FarmerRiver(){int i, movers, nowstatus, newstatus;int status[16]; //用于记录已考虑的状态路径SeqQueue moveTo;moveTo = SetNullQueue_seq(20); //创建空列队EnQueue_seq(moveTo, 0x00); //初始状态时所有物品在北岸,初始状态入队for (i=0; i<16; i++) //数组status初始化为-1{status[i] = -1;}status[0] = 0;//队列非空且没有到达结束状态while (!IsNullQueue_seq(moveTo) && (status[15]==-1)){nowstatus = FrontQueue_seq(moveTo); //取队头DeQueue_seq(moveTo);for (movers=1; movers<=8; movers<<=1)//考虑各种物品在同一侧if ((0!=(nowstatus & 0x08)) == (0!=(nowstatus & movers)))//农夫与移动的物品在同一侧{newstatus = nowstatus ^ (0x08 | movers); //计算新状态//如果新状态是安全的且之前没有出现过if (IsSafe(newstatus)&&(status[newstatus] == -1)){status[newstatus] = nowstatus; //记录新状态EnQueue_seq(moveTo, newstatus); //新状态入队}}}//输出经过的状态路径if (status[15]!=-1){printf("The reverse path is: \n");for (nowstatus=15; nowstatus>=0; nowstatus=status[nowstatus]){printf("The nowstatus is: %d\n", nowstatus);if (nowstatus == 0)return;}}elseprintf("No solution.\n");}Sequeue.c#include <stdio.h>#include <stdlib.h>#include "SeqQueue.h"SeqQueue SetNullQueue_seq(int m){SeqQueue squeue;squeue = (SeqQueue)malloc(sizeof(struct Queue));if (squeue==NULL){printf("Alloc failure\n");return NULL;}squeue->elem = (int *)malloc(sizeof(DataType) * m);if (squeue->elem!=NULL){squeue->Max = m;squeue->f = 0;squeue->r = 0;return squeue;}else free(squeue);}int IsNullQueue_seq(SeqQueue squeue){return (squeue->f==squeue->r);}void EnQueue_seq(SeqQueue squeue, DataType x) //入队{if ((squeue->r+1) % squeue->Max==squeue->f) //是否满printf("It is FULL Queue!");else{squeue->elem[squeue->r] = x;squeue->r = (squeue->r+1) % (squeue->Max);}}void DeQueue_seq(SeqQueue squeue) //出队{if (IsNullQueue_seq(squeue))printf("It is empty queue!\n");elsesqueue->f = (squeue->f+1) % (squeue->Max); }DataType FrontQueue_seq(SeqQueue squeue) //求队列元素{if (squeue->f==squeue->r)printf("It is empty queue!\n");elsereturn (squeue->elem[squeue->f]);}main.c#include <stdio.h>#include <stdlib.h>#include "FarmerRiver.h"int main(void){FarmerRiver();return 0;}实验结果:四、实验总结。

农夫过河问题(C++编写)

农夫过河问题(C++编写)

cout<<" **
------------------------
**\n";
cout<<" **
|
农夫过河问题
|
**\n";
cout<<" **
------------------------
**\n";
cout<<"
****************************************************************************\n";
1、问题描述
从前,一个农夫带着一只狼,一只羊和一棵白菜要河(注意该狼被农夫训服了,但还会 吃羊)。他要将所有东西安全的带到河的对岸,不幸的是河边只有一条船,只能装下农夫和 他的一样东西,并且农夫必须每次都随船过,因为只有他能撑船。在无人看管的情况下,狼 要吃羊,羊要吃白菜,因此,农夫不能在河的某边岸上单独留下狼和羊,也不能单独留下羊 和白菜。那么农夫如何才能使三样东西平安过河呢?
3)、如果上两个条件都不满,则可执行运输的动作,但每次都应考虑,该运 输情况以前是否执行过(即两岸以及船上的东西以时四者各自的状态,并递归的进行下一次运载。
5、系统测试
6、经验总结
解决实际问题时,应先分析实际问题,找出实际问题的所有约束条件, 然后对问题进行数学模型的抽象化,抓主要因素,省去一些不需要的因素,将其 抽象为数学问题,然后再从整体上设计算法,搭建程序的框架,最后一步步完善 细节,这样做,会使本来毫无头绪的问题变得清晰起来。
if (a[ferryTimes][i] == a[ferryTimes][3]) {

农夫过河问题趣味数学

农夫过河问题趣味数学

农夫过河问题趣味数学
农夫过河问题的趣味数学如下:
从前,一个农夫带着一条狗、一只兔子和一棵青菜来到河边,他要把这三件东西带过河去。

河边仅有一只很小的旧船,农夫最多只能带其中的一样东西上船,否则就有沉船的危险。

刚开始,他带了青菜上船,回头一看,调皮的狗正在欺负胆小的兔子。

他连忙把青菜放在岸上,带着狗上了船,但贪嘴的兔子又要吃鲜嫩的青菜,农夫只好又回来。

他坐在岸边,看着这三件东西,静静地思索了一番,终于想出了一个渡河的办法。

第一步,农夫可以先带兔子到对岸,然后自己返回;第二步,带狗到对岸,但把兔子带回来;第三步,把兔子留下,带青菜到对岸,农夫自己返回;第四步,带兔子到对岸。

这样三件东西都完好地带过河去了。

题目 流程农夫过河

题目 流程农夫过河

题目流程农夫过河一、基础过河规则类题目(1 - 5题)题目1:农夫带着狼、羊和一筐白菜要过河。

只有一条小船,农夫每次只能带一样东西过河。

如果农夫不在,狼会吃羊,羊会吃白菜。

请问农夫怎样才能安全地把狼、羊和白菜都运到河对岸?解析:1. 农夫先把羊运到河对岸,然后农夫独自返回。

- 原因是狼不吃白菜,这样河这边留下狼和白菜是安全的。

2. 农夫再把狼运到河对岸,然后农夫带着羊返回。

- 因为如果不把羊带回来,狼会吃羊。

3. 农夫把白菜运到河对岸,然后农夫独自返回。

- 此时河对岸有狼和白菜,是安全的。

4. 最后农夫把羊运到河对岸。

题目2:农夫要带狐狸、鸡和一袋米过河。

船很小,农夫每次只能带一个东西过河。

如果农夫不在,狐狸会吃鸡,鸡会吃米。

农夫应该怎样安排过河顺序?解析:1. 农夫先把鸡运到河对岸,然后农夫独自返回。

- 这样河这边留下狐狸和米是安全的。

2. 农夫再把狐狸运到河对岸,然后农夫带着鸡返回。

- 防止狐狸吃鸡。

3. 农夫把米运到河对岸,然后农夫独自返回。

- 此时河对岸有狐狸和米,安全。

4. 最后农夫把鸡运到河对岸。

题目3:农夫带着狗、兔子和一篮胡萝卜过河。

船只能载农夫和一样东西。

若农夫不在,狗会咬兔子,兔子会吃胡萝卜。

怎样安全过河?解析:1. 农夫先带兔子过河,然后独自返回。

- 因为狗不吃胡萝卜,这样河这边狗和胡萝卜是安全的。

2. 农夫再带狗过河,然后带兔子返回。

- 避免狗咬兔子。

3. 农夫带胡萝卜过河,然后独自返回。

- 此时河对岸狗和胡萝卜安全。

4. 最后农夫带兔子过河。

题目4:有个农夫要带蛇、鼠和一袋谷子过河,船每次只能载农夫和一样东西。

农夫不在时,蛇会吃鼠,鼠会吃谷子。

如何安全渡河?解析:1. 农夫先带鼠过河,然后独自返回。

- 此时河这边蛇和谷子是安全的。

2. 农夫再带蛇过河,然后带鼠返回。

- 防止蛇吃鼠。

3. 农夫带谷子过河,然后独自返回。

- 河对岸蛇和谷子安全。

4. 最后农夫带鼠过河。

题目5:农夫带着猫、鱼和一盆花过河。

数据结构实验-农夫过河问题

数据结构实验-农夫过河问题

农夫过河问题一、实验目的掌握广度优先搜索策略,并用队列求解农夫过河问题二、实验内容问题描述:一农夫带着一只狼,一只羊和一颗白菜,身处河的南岸,他要把这些东西全部运到北岸,遗憾的是他只有一只小船,小船只能容下他和一件物品。

这里只能是农夫来撑船,同时因为狼吃羊、羊吃白菜、所以农夫不能留下羊和狼或羊和白菜在河的一边,而自己离开;好在狼属肉食动物,不吃白菜。

农夫怎么才能把所有的东西安全运过河呢?实验要求如下:(1)设计物品位置的表示方法和安全判断算法;(2)设计队列的存储结构并实现队列的基本操作(建立空队列、判空、入队、出队、取对头元素),也可以使用STL中的队列进行代码的编写;(3)采用广度优先策略设计可行的过河算法;(4)输出要求:按照顺序输出一种可行的过河方案;提示:可以使用STL中的队列进行代码编写。

程序运行结果:二进制表示:1111011011100010101100011001,0000三、农夫过河算法流程⏹Step1:初始状态0000入队⏹Step2:当队列不空且没有到达结束状态1111时,循环以下操作:⏹队头状态出队⏹按照农夫一个人走、农夫分别带上三个物品走,循环以下操作:⏹农夫和物品如果在同一岸,则计算新的状态⏹如果新状态是安全的并且是没有处理过的,则更新path[ ],并将新状态入队⏹当状态为1111时,逆向输出path[ ]数组附录一:STL中队列的使用注:队列,可直接用标准模板库(STL)中的队列。

需要#include<queue>STL中的queue,里面的一些成员函数如下(具体可以查找msdn,搜索queue class):front:Returns a reference to the first element at the front of the queue.pop:Removes an element from the front of the queuepush:Adds an element to the back of the queueempty:Tests if the queue is empty三、实验代码FarmerRiver.H#ifndef FARMERRIVER_H#define FARMERRIVER_Hint FarmerOnRight(int status); //农夫,在北岸返回1,否则返回0int WorfOnRight(int status); //狼int CabbageOnRight(int status); //白菜int GoatOnRight(int status); //羊int IsSafe(int status); //判断状态是否安全,安全返回1,否则返回0void FarmerRiver();#endifSeqQueue.h#ifndef SEQQUEUE_H#define SEQQUEUE_Htypedef int DataType;struct Queue{int Max;int f;int r;DataType *elem;};typedef struct Queue *SeqQueue;SeqQueue SetNullQueue_seq(int m);int IsNullQueue_seq(SeqQueue squeue);void EnQueue_seq(SeqQueue squeue, DataType x);void DeQueue_seq(SeqQueue);DataType FrontQueue_seq(SeqQueue);#endifFarmerRiver.c#include <stdio.h>#include <stdlib.h>#include "SeqQueue.h"#include "FarmerRiver.h"int FarmerOnRight(int status) //判断当前状态下农夫是否在北岸{return (0!=(status & 0x08));}int WorfOnRight(int status){return (0!=(status & 0x04));}int CabbageOnRight(int status){return (0!=(status & 0x02));}int GoatOnRight(int status){return (0!=(status & 0x01));}int IsSafe(int status) //判断当前状态是否安全{if ((GoatOnRight(status)==CabbageOnRight(status)) && (GoatOnRight(status)!=FarmerOnRight(status)))return (0); //羊吃白菜if ((GoatOnRight(status)==WorfOnRight(status)) && (GoatOnRight(status)!=FarmerOnRight(status))) return 0; //狼吃羊return 1; //其他状态是安全的}void FarmerRiver(){int i, movers, nowstatus, newstatus;int status[16]; //用于记录已考虑的状态路径SeqQueue moveTo;moveTo = SetNullQueue_seq(20); //创建空列队EnQueue_seq(moveTo, 0x00); //初始状态时所有物品在北岸,初始状态入队for (i=0; i<16; i++) //数组status初始化为-1{status[i] = -1;}status[0] = 0;//队列非空且没有到达结束状态while (!IsNullQueue_seq(moveTo) && (status[15]==-1)){nowstatus = FrontQueue_seq(moveTo); //取队头DeQueue_seq(moveTo);for (movers=1; movers<=8; movers<<=1)//考虑各种物品在同一侧if ((0!=(nowstatus & 0x08)) == (0!=(nowstatus & movers)))//农夫与移动的物品在同一侧{newstatus = nowstatus ^ (0x08 | movers); //计算新状态//如果新状态是安全的且之前没有出现过if (IsSafe(newstatus)&&(status[newstatus] == -1)){status[newstatus] = nowstatus; //记录新状态EnQueue_seq(moveTo, newstatus); //新状态入队}}}//输出经过的状态路径if (status[15]!=-1){printf("The reverse path is: \n");for (nowstatus=15; nowstatus>=0; nowstatus=status[nowstatus]){printf("The nowstatus is: %d\n", nowstatus);if (nowstatus == 0)return;}}elseprintf("No solution.\n");}Sequeue.c#include <stdio.h>#include <stdlib.h>#include "SeqQueue.h"SeqQueue SetNullQueue_seq(int m){SeqQueue squeue;squeue = (SeqQueue)malloc(sizeof(struct Queue));if (squeue==NULL){printf("Alloc failure\n");return NULL;}squeue->elem = (int *)malloc(sizeof(DataType) * m);if (squeue->elem!=NULL){squeue->Max = m;squeue->f = 0;squeue->r = 0;return squeue;}else free(squeue);}int IsNullQueue_seq(SeqQueue squeue){return (squeue->f==squeue->r);}void EnQueue_seq(SeqQueue squeue, DataType x) //入队{if ((squeue->r+1) % squeue->Max==squeue->f) //是否满printf("It is FULL Queue!");else{squeue->elem[squeue->r] = x;squeue->r = (squeue->r+1) % (squeue->Max);}}void DeQueue_seq(SeqQueue squeue) //出队{if (IsNullQueue_seq(squeue))printf("It is empty queue!\n");elsesqueue->f = (squeue->f+1) % (squeue->Max); }DataType FrontQueue_seq(SeqQueue squeue) //求队列元素{if (squeue->f==squeue->r)printf("It is empty queue!\n");elsereturn (squeue->elem[squeue->f]);}main.c#include <stdio.h>#include <stdlib.h>#include "FarmerRiver.h"int main(void){FarmerRiver();return 0;}实验结果:四、实验总结。

农夫过河问题回溯法python实现

农夫过河问题回溯法python实现

农夫过河问题是经典的逻辑谜题,在这个问题中,农夫需要把一只狼、一只羊和一棵白菜一起带过河。

然而,农夫只有一条小船,而且小船只能容纳农夫和另外一样东西。

而且,如果农夫不在场的话,狼会吃羊,羊会吃白菜。

所以农夫需要想办法把它们一一带过河,而且又不能让狼吃羊或者羊吃白菜。

这个问题看似简单,实际上需要一定的逻辑推理和计划安排才能成功通过。

回溯法是一种常用于解决这类问题的算法。

在计算机科学中,回溯法常常用于解决组合优化问题,它通过不断地尝试所有可能的步骤,直到找到解决方案为止。

在农夫过河问题中,回溯法可以帮助我们列举所有的可能方案,然后找出最优的解决方案。

下面我们将使用Python语言来实现农夫过河问题的回溯法解决方案。

1. 定义问题的状态空间在农夫过河问题中,我们可以定义每一种状态为(农夫位置, 狼位置, 羊位置, 白菜位置)。

其中,农夫位置、狼位置、羊位置和白菜位置均可取值为"左岸"或"右岸"。

(左岸, 左岸, 左岸, 左岸)代表所有的物品都在左岸,而农夫则准备过河。

2. 定义可行动作根据问题的描述,我们可以定义农夫可以采取的可行动作。

具体来说,农夫可以选择带一样东西过河,也可以选择不带东西过河。

我们可以定义可行动作为("不带东西过河"), ("狼过河"), ("羊过河"), ("白菜过河")。

3. 实现回溯法接下来,我们可以使用递归的方式来实现回溯法。

具体来说,我们可以定义一个递归函数backtrack(state, path),其中state表示当前的状态,path表示从起始状态到当前状态的路径。

在递归函数中,我们首先判断是否已经找到了解决方案,如果是,则输出路径并返回;否则,我们尝试所有可行的动作,递归地调用backtrack函数,直到找到解决方案为止。

4. 完整代码实现下面是使用Python语言实现农夫过河问题的回溯法解决方案的完整代码:```pythondef is_valid(state):if state[1] == state[2] and state[0] != state[1]:return Falseif state[2] == state[3] and state[0] != state[2]:return Falsereturn Truedef backtrack(state, path):if state == ('右岸', '右岸', '右岸', '右岸'):print(path)returnactions = [(0, 0), (1, 0), (0, 1), (1, 1)]for i in range(4):new_state = tuple((state[j] if j < 3 else '左岸' if state[j] == '右岸' else '右岸') for j in range(4))if 0 in actions[i] and is_valid(new_state):backtrack(new_state, path + [(actions[i], new_state)])elif is_valid(new_state) and is_valid(tuple([new_state[j] if j != k else state[j] for j in range(4) for k in range(3, 4)])):backtrack(new_state, path + [(actions[i], new_state)])if __name__ == "__m本人n__":initial_state = ('左岸', '左岸', '左岸', '左岸')backtrack(initial_state, [])```在上面的代码中,我们首先定义了一个辅助函数is_valid,该函数用于判断当前状态是否合法。

农夫过河问题

农夫过河问题

农夫过河问题
一、先分析农夫过河的情景:1.他走到了小桥上,遇见了大象;2.他看见小桥很窄,不能通过大象,于是下来,又看见了小兔子;3.小兔子让他再回去把自己带来的萝卜给小猴子送去;4.他想了想,就决定去找乌龟帮忙。

二、农夫为什么要这样做?我们可以用图中所示的几种方法来解答:(1)如果你是农夫,你会怎么办呢?(2)我们在学习时也常常有这样的问题,面对某个复杂的问题,总是从多角度考虑它,然后得出最佳的解决方案。

比如我们要学好数学,需要同学之间互相讨论交流,取长补短,共同进步。

三、根据刚才提供的信息和已经确立的条件,你认为哪些条件更重要?请写出两点理由并说明原因。

四、结合生活实际谈谈应该怎样正确处理人与人之间的关系。

宽搜农夫过河问题

宽搜农夫过河问题

农夫过河问题宽搜(bfs)算法详解农夫过河问题(农夫、狼、羊和白菜的问题),描述如下:一个农夫,带着一只狼、一只羊、和一棵白菜,身处河的南岸,他要把这些东西全部运到北岸。

农夫的面前有一条小船,船小到只能容下他和一件物件。

另外,只能农夫会撑船。

又因为狼能吃羊,而羊爱吃白菜,所以农夫不能留下羊和白菜而自己离开,也不能留下狼和羊而自己离开。

但狼属于食肉动物,不吃白菜。

问农夫采取什么方案才能将所有的东西运过河?解题思路农夫过河问题的求解方法是使用广度优先搜索(BFS),即在搜索过程中总是最先搜索下面一步的所有可能状态,然后再进行考虑更后面的各种情况。

要实现广度优先搜索,一般采用队列结构。

把下一步所有可能达到的状态都列举出来,放在这个队列中,然后顺序取出来分别对其进行处理,处理过程中再把下一步的状态放在队列里。

在采用编程解决农夫过河的问题时,首先需要考虑以下几个问题:•程序中为了方便描述农夫过河过程中几个角色的位置(位于南岸还是北岸),最好的方法是用4 个二进制数,分别顺序表示农夫、狼、白菜和羊的位置。

在本节程序中,用二进制0 表示某角色在河的南岸,用 1 表示某角色在河的北岸。

例如,整数5(其二进制为0101),表示农夫和白菜在河的南岸,而狼和羊在北岸。

•为了方便获取各个角色当前所在的位置,程序中设置了如下 4 个函数。

其中,函数返回值为1,反之则表示角色在河的北岸://表示农夫状态的函数,返回0 ,表示农夫在南岸,反之在北岸。

int farmer(int location){return(0!=(location & 0x08));}//表示狼的状态的函数,返回0 ,表示农夫在南岸,反之在北岸int wolf(int location){return(0!=(location & 0x04));}//表示白菜状态的函数,返回0 ,表示农夫在南岸,反之在北岸int cabbage(int location){return(0!=(location & 0x02));}//表示羊状态的函数,返回0 ,表示农夫在南岸,反之在北岸int goat(int location){return(0!=(location & 0x01));}其中,location 为当前4 种角色所处的状态,其值为0(0000)到15(1111)之间的数。

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

一、题目:农夫过河问题
二、目的与要求
1、目的:
通过布置具有一定难度的实际程序设计项目,使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法;使学生掌握分析问题,求解问题的方法并提高学生设计编程实现的能力。

2、要求:
基本要求:
1.要求利用C\C++语言来完成系统的设计;
2.突出C语言的函数特征(以多个函数实现每一个子功能)或者C++语言面向对象的
编程思想;
3.画出功能模块图;
4.进行简单界面设计,能够实现友好的交互;
5.具有清晰的程序流程图和数据结构的详细定义;
6.熟练掌握C语言或者C++语言的各种操作。

创新要求:
在基本要求达到后,可进行创新设计,如系统用户功能控制,改进算法的实现,实现友好的人机交互等等
三、问题描述和求解方法:
1 、问题描述
要求设计实现农夫过河问题(农夫带着一只狼,一只养,一棵白菜,一次只能带一个东西)如何安全过河。

2 、问题的解决方案:
可以用栈与队列、深度优先搜索算法及广度优先搜索算法相应的原理去解决问题。

1)实现四个过河对象(农夫、白菜、羊和狼)的状态,可以用一个四位二进制数来表示,
0表示未过河,1表示已经过河了。

2)过河的对象必须与农夫在河的同一侧,可以设计函数来判断。

3)防止状态往复,即农夫将一个东西带过去又带回来的情况发生,需将所有可能的状态
进行标定。

4)可用深度优先搜索算法及广度优先搜索算法去解题。

四、解题过程
1.分析程序的功能要求,划分程序功能模块。

2.画出系统流程图。

3.代码的编写。

定义数据结构和各个功能子函数。

4.程序的功能调试。

5.完成系统总结报告以及使用说明书
五、进度安排
此次课程设计时间为一周,分以下几个阶段完成:
1.选题与搜集资料:每人选择一题,进行课程设计课题的资料搜集。

2.分析与概要设计:根据搜集的资料,进行程序功能与数据结构分析,并选择合适的
数据结构、并在此基础上进行实现程序功能的算法设计。

3.程序设计:运用掌握C/C++语言编写程序,实现各个模块功能。

4.调试与测试:调试程序,并记录测试情况。

5.完成课程设计报告。

6.验收与评分:指导教师对每个同学的开发的系统进行综合验收,并由学院考核小组
进行随机抽查评分。

六、撰写课程设计报告或课程设计总结
课程设计报告要求:
课程设计报告要求规范书写,应当包括如下7个部分:
1. 需求分析
2. 系统设计
3. 程序流程图
4. 类关系图
5. 实现代码
6. 总结
7. 参考书目
七、答辩与评分标准:
1 、作业文档:50 分;
2 、基本功能和要求:20 分;
2 、设计报告及使用说明书:10 分;
3 、设置错误或者按照要求改变结果:10 分;
4 、回答问题:10 分。

八、参考资料
《数据结构(C语言版)》
网上相关资料(....略)。

相关文档
最新文档