农夫过河

#include <iostream>
//#include <windows.h>
#define STEP 20
using namespace std;
int m=0,n=0;/*m为take函数执行次数,n为for循环次数*/
int a[STEP][4];/*0狼 1羊 2菜 3人*/
int b[STEP];
int count = 0;
void disp(int s, int n);
void take(int step);
void farmer() {
int i, j;
for(i = 0; i < STEP; i++) {
b[i] = 0;
for(j = 0; j < 4; j++)
a[i][j] = 0;
}
/*初始化*/
take(0);
}
void disp(int s, int n) {
if(s == 0) {
/*人未过,则过去*/
if(n == 0) cout << "农夫自己过去";
else if(n == 1) cout << "把狼送过去";
else if(n == 2) cout << "把羊送过去";
else if(n == 3) cout << "把蔬菜送过去";
cout << "\n";
} else {
/*人已过,则回来*/
if(n == 0) cout << "农夫自己回来";
else if(n == 1) cout << "把狼送回来";
else if(n == 2) cout << "把羊送回来";
else if(n == 3) cout << "把蔬菜送回来";
cout << "\n";
}
}/*输出*/
void take(int step) {
/*printf("\n%d-%d%d%d%d-%d\t",step+1,a[step][0],a[step][1],a[step][2],a[step][3],++m);*/
int i;
if (a[step][0] + a[step][1] + a[step][2] + a[step][3] == 4) {
count++;
cout << " 第" << count << "种方法:\n";
for(i = 0; i < step; i++) {
cout << "第" << i + 1 << "步骤: ";
disp(a[i][3], b[i] + 1);
}
cout << "\n";
return;
}
/*若成功,则结束*/
for (i = 0; i < step; i++)
if(a[i][0] == a[step][0] && a[i][1] == a[step][1] && a[i][2] == a[step][2] && a[i][3] == a[step][3])
return;/*若重复,则结束,否则无限循环*/
if (a[step][1] != a[step][3] && (a[step][2] == a[step][1] || a[step][0] == a[step][1]))
return;/*若危险,则结束*/
for (i = -1; i <= 2; i++) {
b[step] = i;
a[step + 1][0] = a[step][0];
a[step + 1][1] = a[step][1];
a[step + 1][2] = a[step][2];
a[step + 1][3] = a[step][3];/*下次继承本次状态*/
a[step + 1][3] = 1 - a[step + 1][3];/*农夫动*/
/*printf("%d-%d-%d%d%d%d-%d%d%d%d-%d-%d\t",step+1,i+2,a[step][0],a[step][1],a[step][2],a[step][3],a[step+1][0],a[step+1][1],a[step+1][2],a[step+1][3],++n,m);*/
if (i == -1)/*四种情况:农夫自己过 农夫带狼过 农夫带羊过 农夫带菜过*/
take(step + 1);
else if (a[step][i] == a[step][3]) {
a[step + 1][i] = a[step + 1][3];/*带~过河,则~与农夫初末态相同*/
take(step + 1);
}/*60次*/
/*printf("%d-%d-%d%d%d%d-%d%d%d%d-%d-%d\t",step+1,i+2,a[step][0],a[step][1],a[step][2],a[step][3],a[step+1][0],a[step+1][1],a[step+1][2],a[step+1][3],n,m);*/
}
}
int main() {
farmer();
system("pause");
return 0;
}

原文地址:https://www.cnblogs.com/sha-/p/11047854.html

时间: 2024-10-22 10:23:39

农夫过河的相关文章

农夫过河问题算法设计与实现

一个农夫带着-只狼.一只羊和-棵白菜,身处河的南岸.他要把这些东西全部运到北岸.他面前只有一条小船,船只能容下他和-件物品,另外只有农夫才能撑船.如果农夫在场,则狼不能吃羊,羊不能吃白菜,否则狼会吃羊,羊会吃白菜,所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,而狼不吃白菜.请求出农夫将所有的东西运过河的方案. 实现上述求解的搜索过程可以采用两种不同的策略:一种广度优先搜索,另一种深度优先搜索.这里介绍在广度优先搜索方法中采用的数据结构设计. 程序源码: /*************

数据结构设计——农夫过河问题

农夫过河问题 1. 问题描述: 设有一个农夫带一只狼,一只羊和一筐菜来到河边,打算乘一只船从右岸渡到左岸去.该船的负载能力为农夫每次只能带一样东西过河.在无农夫的时候,狼和羊不能在一起,羊和菜不能在一起.设计一个方案,使农夫可以无损失地渡过河. 2. 设计思路: 设计好图的结构,点以(农夫,狼,羊,菜)表示,设置图的点集,边集,点数,边数: 用is_safe函数确定图中各点是否安全,将不安全的点去掉,剩下安全的点,然后判断两点之间是否可变换,再通过层次遍历找到路径,设定好参数,打印出路径: 3.

农夫过河问题 简单的搜索

// 用一个二进制串表示状态0,表示东西或者人在河的这边 // 1表示东西或者人在河的另一边 // 比如0000表示都在起始的位置,1111表示都到了对岸 // 通过状态的转移,来找到路径 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 100; const int inf =

过河问题(图论方法)

农夫过河问题 问题描述 一个农夫带着一头狼.一头羊.一颗白菜过河.他面前只有一条船,只能容纳他和一件物品,只有农夫会划船.如果农夫不在场,狼会吃羊.羊会吃白菜,农夫在场则不会.求将所有物品运到对岸的方案. 解题思路 根据物品的位置定义状态,若在左岸记为1,右岸记为0,于是最终方案就是(1,1,1,1)-->(0,0,0,0)所经过的路径. 1.定义状态 2.列举所有状态(人.狼.羊.菜) 3.删除不合理的状态(狼和羊.羊和菜) 4.连边(模拟一次渡河) 5.寻找路径 寻找(1111)-->(0

采用 PAT工具及CSP语言,对一个问题进行自动机 建模

pat是新加坡国立开发的工具,需要的去官网下http://www.comp.nus.edu.sg/~pat/ ,学了一天,是个不错的自动机验证工具,感觉还不错啊. 验证一个数是否为斐波那契数且为质数 方法 先验证是否为斐波那契数,然后再判断质数 代码 /*验证是否为 斐波那契数且是质数*/ #define goal (b==13 && f==1); //是斐波那契数且是质数 #define no1goal(b==21 && f==1);// 是斐波那契数不是质素 #defi

ACM算法集锦

kurXX最小生成树 #include <iostream> #include <math.h> #include <algorithm> using namespace std; #define M 501 #define LIM 20000000 struct edg{ int u,v; int w; }all_e[M*M/2]; bool operator < (const edg &a,const edg &b){ return a.w&l

过河问题(牛虎过河、商人仆人过河、农夫妖怪过河、传教士野人过河)(第2届第2题)

题目要求 问题描述:三只牛三只虎过河,船最多只能容纳两只动物,且船在往返途中不能为空.在任一岸边,若牛的数量少于虎的数量,则牛就会被老虎吃掉.为了使动物全部过河且使无损失,请制定合理的渡河方案. 解决方案 这也是一个经典的渡河问题了,由此衍化出的版本有商人仆人(随从)过河,农夫妖怪过河,传教士野人过河...除了角色有变化,内容本质上是一样的. 假设原来的动物和船都在A岸,现在想渡河到对面的B岸.考虑牛虎数量和船的位置,可以将本题中的所有可能出现的情形描述为静态属性和动态属性.静态属性就是船停靠在

农夫运送猫狗鱼过河问题(面向对象)

题设:农夫欲用船将左岸的猫.狗.鱼运送到右岸.在运送的过程中,每次只能运送一只动物,农夫也可以空船过河.其中当人不在此岸时,狗会咬猫:猫会吃鱼.当人在此岸时,则不会发生冲突.请用面向对象的设计思想解决此类问题. 分析:通过题设条件可以得出以下结论:1.左到右,不存在从左岸到右岸的空船(也就是从左岸到右岸必须运送一只动物):2.右到左,有且只有两种情况:①空船过河.②带一只动物过河. 程序设计:5个类:MyCrossRiver.java.CrossProcess.java.CrossStep.ja

养殖者运送猫狗过河问题(面向对象)

让标题:农民希望猫左岸用船.狗.鱼运至右岸. 在运输过程中,每次只能运送一个单纯的动物.过河农民可以空船. 当中当人不在此岸时,狗会咬猫.猫会吃鱼.当人在此岸时,则不会发生冲突. 请用面向对象的设计思想解决此类问题. 分析:通过题设条件能够得出下面结论:1.左到右,不存在从左岸到右岸的空船(也就是从左岸到右岸必须运送一仅仅动物):2.右到左.有且仅仅有两种情况:①空船过河.②带一仅仅动物过河. 程序设计:5个类:MyCrossRiver.java.CrossProcess.java.CrossS