哪位能提供一个C++编写的自动机的源码和解释.

tsjit 2003-12-19 09:29:10
?
...全文
123 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
tsjit 2003-12-22
  • 打赏
  • 举报
回复
没有更高明的吗?
Chrisma 2003-12-19
  • 打赏
  • 举报
回复
5.9 定义类描述有限状态自动机,状态的输入和输出关系可以描述为链表数据成员:
class STATE;
class LIST{
LIST *next;
char input;
STATE *output;
LIST(char in, STATE *out); //私有,仅供STATE使用
~LIST( );
friend STATE;
};
class STATE{
char *name; //状态名
LIST *list; //输入及输出列表
static STATE*error;
public:
void enlist(char in, STATE *out); //插入list
const STATE *next(char in)const; //输入in转移到下一个状态
const STATE *start(char *)const; //启动有限自动机
STATE(char *name);
~STATE( );
};
使用有限自动机编程解决如下问题:有一个人带着狼、羊和草来到河的左岸,左岸只有一条无人摆渡的船。这个人要从左岸过河到右岸,可是这条船最多只能装一个人和其他三者之一,否则便会沉没。如果没有人看管,狼会吃掉羊,或者羊吃掉草。问如何过河才能保证羊和草的安全。
提示:作为有限状态自动机的输入,人单独过河用字符m表示,人带狼过河用字符w表示,人带羊过河用字符s表示,人带草过河用字符g表示,声明有限自动机的start、stop以及error状态对象,如果start.start("smwsgms")=&stop,则过河成功,否则,如果start.start("smwsgms") ==&error,则过河失败。
解:以下定义的类STATE用于表示自动机的状态,其中static STATE*error表示自动机的错误陷阱,进入错误陷阱后其他任何输入都不能改变自动机的状态。开始时,人狼羊草都在河的左岸,初试状态start表示为"WSGM_",人带着羊过河后状态变为"WG_SM",用start.enlist('S', &WG_SM)将这一操作加入状态转移表。自动机的状态转移表存放类LIST中,由以下自动的状态转移图可知,本题有两个过河路径最小解。

图5.1 人带狼羊草过河的有限状态自动机
#include <string.h>
#include <iostream.h>
class STATE;
class LIST{
LIST *next;
char input;
STATE *output;
LIST(char in, STATE *out); //私有,仅供STATE使用
~LIST( );
friend STATE;
};
LIST::LIST(char in, STATE *out){
input=in;
output=out;
next=0;
}
LIST::~LIST( ){
if(this->next){ delete this->next;}
}
class STATE{
char *name; //状态名
LIST *list; //输入及输出状态转移列表
static STATE*error;
public:
void enlist(char in, STATE *out); //插入list
const STATE *next(char in)const; //输入in转移到下一个状态
const STATE *start(char *)const; //启动有限自动机
STATE(char *name);
~STATE( );
};
STATE *STATE::error=0;
STATE::STATE(char *name):name(0),list(0){
if(name==0){ error=this; return; }
STATE::name=new char[strlen(name)+1];
strcpy(STATE::name, name);
}
void STATE::enlist(char in, STATE *out){ //插入list
LIST *temp;
if(list==0){
list=new LIST(in, out);
return;
}
temp=new LIST(in, out);
temp->next=list;
list=temp;
}
const STATE *STATE::next(char in)const{ //输入in转移到下一个状态
LIST *temp=list;
if(this==error) return error;
while(temp)
if(temp->input==in) return temp->output;
else temp=temp->next;
return error;
}
const STATE *STATE::start(char *s)const{ //启动有限自动机
const STATE *temp=this;
while(*s) temp=temp->next(*s++);
return temp;
}
STATE::~STATE( ){
if(name) {cout<<name<<"\n"; delete name; name=0; }
if(list) {delete list; list=0; }
}
void main( ){
STATE start("WSGM_");
STATE stop("_WSGM");
STATE error(0);
STATE WG_SM("WG_SM");
STATE WGM_S("WGM_S");
STATE G_WSM("G_WSM");
STATE SGM_W("SGM_W");
STATE W_SGM("W_SGM");
STATE WSM_G("WSM_G");
STATE S_WGM("S_WGM");
STATE SM_WG("SM_WG");
start.enlist('S', &WG_SM);
WG_SM.enlist('S', &start);
WG_SM.enlist('M', &WGM_S);
WGM_S.enlist('M', &WG_SM);
WGM_S.enlist('W', &G_WSM);
WGM_S.enlist('G', &W_SGM);
G_WSM.enlist('W', &WGM_S);
W_SGM.enlist('G', &WGM_S);
G_WSM.enlist('S', &SGM_W);
SGM_W.enlist('S', &G_WSM);
SGM_W.enlist('G', &S_WGM);
S_WGM.enlist('G', &SGM_W);
W_SGM.enlist('S', &WSM_G);
WSM_G.enlist('S', &W_SGM);
WSM_G.enlist('W', &S_WGM);
S_WGM.enlist('W', &WSM_G);
S_WGM.enlist('M', &SM_WG);
SM_WG.enlist('M', &S_WGM);
SM_WG.enlist('S', &stop);
stop.enlist('S', &SM_WG);
if(start.start("SMWSGMSSS")==&stop) cout<<"OK";
}


只要把主程序改改,可以做任何自动机

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧