农夫过河
农民过河问题是指农民需要带一只狼、一只羊和一棵白菜到河的南岸去,需要安全运到北岸。而一条小船只能容下他和一件物品,只有农民能撑船。问农民怎么能安全过河,问题中需要涉及到狼会吃羊,羊会吃白菜,所以农民不能将这两种或三种物品单独放在河的一侧,因为没有农民的照看,狼就要吃掉羊,而羊可能又要吃掉白菜。 这类问题的实质是系统的状态问题,要寻求的是从初始状态经一系列的安全状态到达系统的终止状态的一条路径。根据实际情况,对此问题分析可以得到不同的特征:一是农民和羊在河的南岸,狼和白菜在河的北岸;二是从一个状态可转到另外一个状态,而不违反狼吃羊,羊吃草的规则(例如农民自己过河或者农民带着羊过河);三是有些状态是不安全的(例如农民一人在北岸,而其他的东西都在南岸);四是初始状态是农民,羊,狼,白菜都在河的南岸和结束状态是农民,羊,狼,白菜都在河的北岸。
实现农民过河问题,则需要找到一条合法的路径(相邻状态之间的转移合法),从开始状态到某个结束状态,路途中不能经过不安全的状态。
二、 实验目的概述(总体设计方案)
a ) 利用图的有关知识来解决农民过河问题
b ) 根据图的广度(深度)优先搜索来实现实验要求
在实施此问题中,首先要为农民,狼,白菜和羊设置求状态的函数,若某一种物品在河的南岸,则返回0,若在河的的北岸,则返回1;其次是为每一种状态做测试,状态安全则返1,否则返回0。
代码很简单思路也很简单…就水一篇…
(代码因为课设的好看一点就尽量拉长了长度…还有要改进的地方,有空再水)
//解题思路
/*
一条船,载重为二,因为农夫要划船,所以不管怎么样农夫始终要在船上往返于南北岸。农夫要过河,单独把狼和羊放一起狼会吃羊;单独把羊和白菜放一起,羊会吃白菜。所以,狼和白菜是一对的安全判断点。第一次把羊运到河对岸,农夫回到原点,带走白菜(狼)运到河对岸,回原点的时候带上羊,再去河对岸的时候把狼(白菜),又凑成安全条件,最后再返回原点把羊接回来。羊作为中间物,吃白菜,又被狼吃,所以它是题目的平衡点,它要么单独存在,要么和农夫在一起,这就是完成题目的判断合法状态的关键。
*/
#include <algorithm>
#include <cstring>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
int farmer = 0, sheep = 0, wolf = 0, cabbage = 0, safety =