农夫过河
来源:互联网 发布:开机后网络启动很慢 编辑:程序博客网 时间:2024/06/08 00:33
本课题要求出完整程序,能够解决下面的问题:
一个农夫带着一只羊,一条狼和一颗白菜想从河的东岸到西岸去。河上仅有一条船。假设他每次只能带一只羊,或者一条狼,或者一颗白菜过河,并且当人不在场时,狼和羊,或羊和白菜不能单独在一起。求出他带一只羊,一条狼和一颗白菜过河的所有办法。狼和羊、羊和白菜不能单独在一起,涉及对象较多,而且运算步骤方法较为复杂,要用程序语言实现,需要将具体实例数字化。针对实现整个过程需要多步,不同步骤中各个事物所处位置不同的情况,没有对先后顺序进行约束,这就需要给各个事物依次进行编号,然后依次试探,若试探成功,进行下一步试探。这就需要使用循环或者递归算法,避免随机盲目运算且保证每种情况均试探到。
#include <stdio.h>struct Condition { 定义结构体数组int farmer;int wolf;int sheep;int cabbage;}; struct Condition conditions[100]; char* action[100]; 定义一个记录过程的数组 void takeWolfOver(int i) 带狼过河{action[i] = "带狼过河";conditions[i + 1].wolf = 1;conditions[i + 1].sheep = conditions[i].sheep;conditions[i + 1].cabbage = conditions[i].cabbage;} void takeWolfBack(int i) 带狼回来{action[i] = "带狼回来";conditions[i + 1].wolf = 0;conditions[i + 1].sheep = conditions[i].sheep;conditions[i + 1].cabbage = conditions[i].cabbage;} void takeSheepOver(int i) 带羊过河{action[i] = "带羊过河";conditions[i + 1].wolf = conditions[i].wolf;conditions[i + 1].sheep = 1;conditions[i + 1].cabbage = conditions[i].cabbage;} void takeSheepBack(int i) 带羊回来{action[i] = "带羊回来";conditions[i + 1].wolf = conditions[i].wolf;conditions[i + 1].sheep = 0;conditions[i + 1].cabbage = conditions[i].cabbage;} void takeCabbageOver(int i) 带白菜过河{action[i] = "带白菜过河";conditions[i + 1].wolf = conditions[i].wolf;conditions[i + 1].sheep = conditions[i].sheep;conditions[i + 1].cabbage = 1;} void takeCabbageBack(int i) 带白菜回来{action[i] = "带白菜回来";conditions[i + 1].wolf = conditions[i].wolf;conditions[i + 1].sheep = conditions[i].sheep;conditions[i + 1].cabbage = 0;} void getOverBarely(int i) 独自过河{action[i] = "独自过河";conditions[i + 1].wolf = conditions[i].wolf;conditions[i + 1].sheep = conditions[i].sheep;conditions[i + 1].cabbage = conditions[i].cabbage;} void getBackBarely(int i) 独自回来{action[i] = "独自回来";conditions[i + 1].wolf = conditions[i].wolf;conditions[i + 1].sheep = conditions[i].sheep;conditions[i + 1].cabbage = conditions[i].cabbage;} void showSolution(int i) 显示解决方案{int c;printf("%s\n", "Solution:");for (c = 0; c<i; c++){printf("%d. %s\n", c + 1, action[c]);}printf("%s\n", "Ok! Nice job!");} void tryOneStep(int i){int c;int j;//check for recursion problem.if (i >= 100) 当过程超过100步,报错{printf("%s\n", "Index reached 100. Something is wrong. ");return;}//check for win.if (conditions[i].farmer == 1 && 当狼,农夫,羊,白菜同时在对岸,完成conditions[i].wolf == 1 &&conditions[i].sheep == 1 &&conditions[i].cabbage == 1){showSolution(i);return;}//check for lose.if ((conditions[i].farmer != conditions[i].wolf && conditions[i].wolf == conditions[i].sheep)||(conditions[i].farmer != conditions[i].sheep && conditions[i].sheep == conditions[i].cabbage)) 当农夫和狼分开,狼和羊在一起,失败{ 当农夫和羊分开,羊和白菜在一起,失败return;} for (c = 0; c<i; c++) 检查重复步骤{if (conditions[c].farmer == conditions[i].farmer&&conditions[c].wolf == conditions[i].wolf&&conditions[c].sheep == conditions[i].sheep&&conditions[c].cabbage == conditions[i].cabbage){return;}} j = i + 1;if (conditions[i].farmer == 0) 深度优先{ 递归法conditions[j].farmer = 1;getOverBarely(i);tryOneStep(j); if (conditions[i].wolf == 0){takeWolfOver(i);tryOneStep(j);}if (conditions[i].sheep == 0){takeSheepOver(i);tryOneStep(j);}if (conditions[i].cabbage == 0){takeCabbageOver(i);tryOneStep(j);}}else{conditions[j].farmer = 0; getBackBarely(i);tryOneStep(j); if (conditions[i].wolf == 1){takeWolfBack(i);tryOneStep(j);}if (conditions[i].sheep == 1){takeSheepBack(i);tryOneStep(j);}if (conditions[i].cabbage == 1){takeCabbageBack(i);tryOneStep(j);}}} int main(){conditions[0].farmer = 0;conditions[0].wolf = 0;conditions[0].sheep = 0;conditions[0].cabbage = 0;//use recursion to find out how to.tryOneStep(0);}
0 0
- 农夫过河
- 农夫过河
- 农夫过河
- 农夫过河
- 农夫过河
- 农夫过河问题实现
- 农夫过河问题
- 数据结构课程设计--农夫过河
- 农夫过河问题
- 农夫过河问题
- 【人工智能】农夫过河问题
- 农夫过河问题
- 农夫、狼、羊过河问题
- 农夫过河问题的求解
- C语言农夫过河问题
- c实现农夫过河问题
- 农夫过河问题学习笔记
- 农夫过河【数据结构实验报告】
- 【NOIP12TGD2T2】洛谷1083 借教室
- 《Python数据分析基础教程:Numpy学习指南》 常用模块与方法简要记录
- 数据结构之Dijkstra算法
- 论文笔记 | R-FCN: Object Detection via Region-based Fully Convolutional Networks
- 组合测试法中的全对偶测试法
- 农夫过河
- easyui radio 无法选中的原因
- 机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用
- android-----在Activity启动时获得View宽高
- Shiro 安全框架
- HDU——2083找单词(母函数)
- C语言 将三个数按从大到小输出
- ubuntu dpkg -i 依赖问题
- 【Java进阶四】抽象类和接口