(状态机)狼羊菜过河的程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 LIST_TURN;

typedef std::list LIST_NODE;

// 判断两个状态是否一致

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) {

相关文档
最新文档