资源简介
本题的状态转换算法依然是对状态空间中所有状态进行深度优先搜索,因为狼、羊和菜不会划船,所以状态转换算法也很简单,不需要象“用三个水桶均分8升水”问题那样要用排列组合的方式确定转换方法(倒水动作),本题一共只有8种固定的状态转换运算(过河动作),分别是:
农夫单独过河;
农夫带狼过河;
农夫带羊过河;
农夫带菜过河;
农夫单独返回;
农夫带狼返回;
农夫带羊返回;
农夫带菜返回.
代码片段和文件信息
#include
using namespace std;
#define VertexNum 16 //最大顶点数
typedef struct // 图的顶点
{
int farmer; // 农夫
int wolf; // 狼
int sheep; // 羊
int veget; // 白菜
}Vertex;
typedef struct
{
int vertexNum; // 图的当前顶点数
Vertex vertex[VertexNum]; // 顶点向量(代表顶点)
bool Edge[VertexNum][VertexNum]; // 邻接矩阵. 用于存储图中的边,其矩阵元素个数取决于顶点个数
}AdjGraph; // 定义图的邻接矩阵存储结构
bool visited[VertexNum] = {false}; // 对已访问的顶点进行标记(图的遍历)
int retPath[VertexNum] = {-1}; // 保存DFS搜索到的路径
// 查找顶点(F,W,S,V)在顶点向量中的位置
int locate(AdjGraph *graph int farmer int wolf int sheep int veget)
{
for (int i = 0; i < graph->vertexNum; i++)
{
if ( graph->vertex[i].farmer == farmer && graph->vertex[i].wolf == wolf && graph->vertex[i].sheep == sheep && graph->vertex[i].veget == veget )
{
return i; //返回当前位置
}
}
return -1; //没有找到此顶点
}
// 判断目前的(F,W,S,V)是否安全
bool isSafe(int farmer int wolf int sheep int veget)
{
//当农夫与羊不在一起时,狼与羊或羊与白菜在一起是不安全的
if ( farmer != sheep && (wolf == sheep || sheep == veget) )
{
return false;
}
else
{
return true; // 安全返回true
}
}
// 判断状态i与状态j之间是否可转换
bool isConnect(AdjGraph *graph int i int j)
{
int k = 0;
if (graph->vertex[i].wolf != graph->vertex[j].wolf)
{
k++;
}
if (graph->vertex[i].sheep != graph->vertex[j].sheep)
{
k++;
}
if (graph->vertex[i].veget != graph->vertex[j].veget)
{
k++;
}
// 以上三个条件不同时满足两个且农夫状态改变时,返回真 也即农夫每次只能带一件东西过桥
if (graph->vertex[i].farmer != graph->vertex[j].farmer && k <= 1)
{
return true;
}
else
{
return false;
}
}
// 创建连接图 调用isSafe isConnect函数
void CreateG(AdjGraph *graph)
{
int i = 0;
int j = 0;
// 生成所有安全的图的顶点 找到安全的顶点
for (int farmer = 0; farmer <= 1; farmer++)
{
for (int wolf = 0; wolf <= 1; wolf++)
{
for (int sheep = 0; sheep <= 1; sheep++)
{
for (int veget = 0; veget <= 1; veget++)
{
if (isSafe(farmer wolf sheep veget))
{
graph->vertex[i].farmer = farmer;
graph->vertex[i].wolf = wolf;
graph->vertex[i].sheep = sheep;
- 上一篇:任务书2一元稀疏多项式计算器数据结构报告
- 下一篇:基于SNMP的网络流量监视系统
相关资源
- listing_4.1.cpp
- 矩形切割,用的是递归算法。
- 编译原理正则表达式转NFA转DFA DFA最小
- 5.1归并递归排序.cpp
- UKF C++版本
- 家谱管理系统.cpp
- C++写的flappy bird游戏 代码cpp源文件通
- 文章编辑系统源代码.cpp
- 段页式存储管理地址转换.cpp
- 302_规格划分矩形.cpp
- Qt4 For Dev-Cpp Templates
- C++ Serialport 串口通信类
- Vimba CPP Manual中文.docx
- Itti显著性模型(cpp)较原版简洁易懂
- openCV中stitching_detailed.cpp
- L.CPP
- MFC操作Excel表,excel.hexcel.cpp源码
- 用c++模拟直线插补和圆弧插补二.cpp
- 用c++模拟直线插补和圆弧插补一.cpp
- test_opencv.cpp
- MFC中使用JSONCPP_VS2013
- 2.Newton插值公式.cpp
- activemq-cpp开发手册.pdf
- matlab2016b配置VS2017编译器mexopts补丁文
- 支持多标签的convert_imageset.cpp代码
- dft.cpp
- sanke.cpp
- dos.cpp
- s盒的C语言实现,S盒.cpp文件
- 奖学金评定系统5.0.cpp
评论
共有 条评论