(状态机)狼羊菜过河的程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
过河问题大家都知道,不多说了.
解决这个问题的经典方法就是使用有限状态机. 根据人,狼,羊,菜,在不同河岸,可以抽象出N种不同的状态.某些状态之间可以转换. 这些转换就是运算了. 我们的目的就是找到一组这样的运算,可以从初始状态转换到终止状态. 其间的状态必需都是合法的. C++代码如下:
/*-------------------------------------
农夫,狼,羊,菜,过河
--------------------------------------*/
#include
#include
enum PLACE
{
NO, // 没有过河的
YES, // 已经过河了
};
// 状态
typedef struct
{
PLACE man; // 人的状态
PLACE wolf; // 狼的状态
PLACE sheep; // 羊有状态
PLACE menu; // 菜的状态
} STATUS;
const STATUS c_start = {NO,NO,NO,NO}; // 起始状态
const STATUS c_end = {YES,YES,YES,YES}; // 终止状态
// 结点(保存转换路径)
typedef struct TURN{
STATUS status;
TURN* p;
}TURN;
typedef std::list
typedef std::list
// 判断两个状态是否一致
bool operator == (const STATUS& sa, const STATUS& sb)
{
return sa.man == sb.man && sa.wolf == sb.wolf &&
sa.sheep == sb.sheep && sa.menu == sb.menu;
}
// 查找状态是否已经存在
bool Find(LIST_TURN& ls, const STATUS& s)
{
LIST_TURN::iterator it = ls.begin();
for(;it!=ls.end(); it++)
{
if((*it).status==s)
return true;
}
return false;
}
// 状态转换运算
enum OPERATOR
{
MAN_GO, // 人过河
MAN_GO_WI TH_WOLF, // 人带狼过河
MAN_GO_WI TH_SHEEP, // 人带羊过河
MAN_GO_WI TH_MENU, // 人带菜过河
MAN_BACK, // 人回来
MAN_BACK_WI TH_WOLF, // 人带狼回来
MAN_BACK_WI TH_SHEEP, // 人带羊回来
MAN_BACK_WI TH_MENU, // 人带菜回来
OP_FIRST = MAN_GO,
OP_LAST = MAN_BACK_WITH_MENU,
};
// 状态转换
bool StatusTurn(const STATUS& src, OPERATOR op, STATUS& desc) {
switch(op)
{
case MAN_GO: // 人过河
if(src.man == NO) {
desc = src;
desc.man = YES;
return true;
}
break;
case MAN_GO_WI TH_WOLF: // 人带狼过河
if(src.man == NO && src.wolf == NO)
{
desc = src;
desc.man = YES;
desc.wolf = YES;
return true;
}
break;
case MAN_GO_WI TH_SHEEP: // 人带羊过河
if(src.man == NO && src.sheep == NO) {
desc = src;
desc.man = YES;
desc.sheep = YES;
return true;
}
break;
case MAN_GO_WI TH_MENU: // 人带菜过河
if(src.man == NO && src.menu == NO) {
desc = src;
desc.man = YES;
desc.menu = YES;
return true;
}
break;
case MAN_BACK: // 人回来
if(src.man == YES) {
desc = src;
desc.man = NO;
return true;
}
break;
case MAN_BACK_WI TH_WOLF: // 人带狼回来
if(src.man == YES && src.wolf == YES) { desc = src;
desc.man = NO;
desc.wolf = NO;
return true;
}
break;
case MAN_BACK_WI TH_SHEEP: // 人带羊回来
if(src.man == YES && src.sheep == YES) {