一、实验题目
使用有限自动机编程解决如下问题:有一个人带着狼、羊和草来到河的左岸。左岸只有一条无人摆渡的船,这个人要从左岸过河到右岸。可是这条船最多只能装一个人和其他三者之一,否则便会沉没。如果没有人看管,狼会吃掉羊,或者羊吃掉草。问如何过河才能保证羊和草的安全?
二、题目分析
W代表狼,G代表草,S代表羊,M代表人。初始状态”WSGM_”,结束状态”_WSGM”。人单独过河用字符m 表示,人带狼过河用字符w表示,人带羊过河用字符s 表示,人带草过河用字符g 表示。
三、程序代码
1、源文件head.h内容
Code:
- #include <cstdlib>
- #include <iostream>
- #include <string.h>
- using namespace std;
- class State;
- class List{
- List *next;
- char input;
- State *output;
- List(char in,State *out);
- ~List();
- friend class State;
- };
- class State{
- char *name;
- List *list;
- static State *error;
- public:
- void enList(char in,State *out);
- const State *next(char in)const;
- const State *start(char *)const;
- State(char *name);
- ~State();
- };
- 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) { delete name; name=0; } <