`
liss
  • 浏览: 824819 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

自动状态机实现经典过河问题

阅读更多

一、实验题目

       使用有限自动机编程解决如下问题有一个人带着狼、羊和草来到河的左岸。左岸只有一条无人摆渡的船,这个人要从左岸过河到右岸。可是这条船最多只能装一个人和其他三者之一,否则便会沉没。如果没有人看管,狼会吃掉羊,或者羊吃掉草。问如何过河才能保证羊和草的安全?
二、题目分析
     W代表狼,G代表草,S代表羊,M代表人。初始状态”WSGM_”,结束状态”_WSGM”。人单独过河用字符m 表示,人带狼过河用字符w表示,人带羊过河用字符s 表示,人带草过河用字符g 表示。
 

三、程序代码
1、源文件head.h内容
Code:
  1. #include <cstdlib>   
  2. #include <iostream>   
  3. #include <string.h>   
  4.   
  5. using namespace std;   
  6.   
  7. class State;   
  8. class List{   
  9.     List *next;   
  10.     char input;   
  11.     State *output;   
  12.     List(char in,State *out);   
  13.     ~List();   
  14.     friend class State;   
  15. };   
  16.   
  17. class State{   
  18.     char *name;   
  19.     List *list;   
  20.     static State *error;   
  21. public:   
  22.     void enList(char in,State *out);   
  23.     const State *next(char in)const;   
  24.     const State *start(char *)const;   
  25.     State(char *name);   
  26.     ~State();   
  27. };   

 

  1.  
  2.     if(name==0){ error=thisreturn; }   
  3.     State::name=new char[strlen(name)+1];   
  4.     strcpy(State::name, name);   
  5. }   
  6.   
  7. void State::enList(char in, State *out){ //插入list   
  8.     List *temp;   
  9.     if(list==0){   
  10.         list=new List(in, out);   
  11.         return;   
  12.     }   
  13.     temp=new List(in, out);   
  14.     temp->next = list;   
  15.     list=temp;   
  16. }   
  17.   
  18. const State *State::next(char in)const//输入in 转移到下一个状态   
  19.     List *temp=list;   
  20.     if(this==error) return error;   
  21.     while(temp)   
  22.         if(temp->input==in) return temp->output;   
  23.         else temp=temp->next;   
  24.     return error;   
  25. }   
  26.   
  27. const State *State::start(char *s)const//启动有限自动机   
  28.     const State *temp = this;   
  29.     while(*s) temp=temp->next(*s++);   
  30.     return temp;   
  31. }   
  32.   
  33. State::~State( ){   
  34.     if(name) { delete name; name=0; }   
  35.     if(list) {delete list; list=0; }   
  36. }   

 

 

 
3、源文件List.cpp内容
Code:
  1. #include"head.h"   
  2. List::List(char in, State *out){   
  3.     input=in;   
  4.     output=out;   
  5.     next=0;   
  6. }   
  7. List::~List( ){   
  8.     if(this->next){ delete this->next;}   
  9. }   

 

 

 4、源文件lab1.cpp内容

Code:
  1. #include"head.h"    
  2. int main( ){   
  3.     State start("WSGM_");   
  4.     State stop("_WSGM");   
  5.     State error(0);   
  6.     State WG_SM("WG_SM");   
  7.     State WGM_S("WGM_S");   
  8.     State G_WSM("G_WSM");   
  9.     State SGM_W("SGM_W");   
  10.     State W_SGM("W_SGM");   
  11.     State WSM_G("WSM_G");   
  12.     State S_WGM("S_WGM");   
  13.     State SM_WG("SM_WG");   
  14.     start.enList('S', &WG_SM);   
  15.     WG_SM.enList('S', &start);   
  16.     WG_SM.enList('M', &WGM_S);   
  17.     WGM_S.enList('M', &WG_SM);   
  18.     WGM_S.enList('W', &G_WSM);   
  19.     WGM_S.enList('G', &W_SGM);   
  20.     G_WSM.enList('W', &WGM_S);   
  21.     W_SGM.enList('G', &WGM_S);   
  22.     G_WSM.enList('S', &SGM_W);   
  23.     SGM_W.enList('S', &G_WSM);   
  24.     SGM_W.enList('G', &S_WGM);   
  25.     S_WGM.enList('G', &SGM_W);   
  26.     W_SGM.enList('S', &WSM_G);   
  27.     WSM_G.enList('S', &W_SGM);   
  28.     WSM_G.enList('W', &S_WGM);   
  29.     S_WGM.enList('W', &WSM_G);   
  30.     S_WGM.enList('M', &SM_WG);   
  31.     SM_WG.enList('M', &S_WGM);   
  32.     SM_WG.enList('S', &stop);   
  33.     stop.enList('S', &SM_WG);   
  34.     if(start.start("SMWSGMSSS")==&stop) cout<<"过河成功!\n";   
  35.     else cout<<"过河失败!\n";   
  36.     getchar();   
  37.     return 1;   
  38.  }   

四、实验结果

Code:
  1. #include"head.h"   
  2. // 用M 表示人 用W 表示野人 B代表船    
  3. // 初始状态为"BMMMYYY_" 终止状态为 "_BMMMYYY"    
  4. //过河动作可以有五种:人单独过河s 两个人过河d 野人单独过河w 两个野人过河t人带着野人过河b    
  5. int main( ){   
  6.     char m[80];   
  7.     State error(0);   
  8.     State start("start");//BMMMYYY_   
  9.     State MMMY_BYY("MMMY_BYY");//1   
  10.     State MMYY_BMY("MMYY_BMY");//2   
  11.     State BMMMYY_Y("BMMMYY_Y");//3   
  12.     State MMM_BYYY("MMM_BYYY");//4   
  13.     State BMMMY_YY("BMMMY_YY");//5   
  14.     State MY_BMMYY("MY_BMMYY");//6   
  15.     State BMMYY_MY("BMMYY_MY");//7   
  16.     State YY_BMMMY("YY_BMMMY");//8   
  17.     State BYYY_MMM("BYYY_MMM");//9   
  18.     State Y_BMMMYY("Y_BMMMYY");//10   
  19.     State BMY_MMYY("BMY_MMYY");//11   
  20.     State BYY_MMMY("BYY_MMMY");//12   
  21.     State stop("stop");//_BMMMYYY   
  22.        
  23.     start.enList('t',&MMMY_BYY);   
  24.     start.enList('b',&MMYY_BMY);   
  25.   
  26.     MMMY_BYY.enList('t',&start);   
  27.     MMMY_BYY.enList('w',&BMMMYY_Y);   
  28.   
  29.     MMYY_BMY.enList('b',&start);   
  30.     MMYY_BMY.enList('s',&BMMMYY_Y);   
  31.        
  32.     BMMMYY_Y.enList('w',&MMMY_BYY);   
  33.     BMMMYY_Y.enList('s',&MMYY_BMY);   
  34.     BMMMYY_Y.enList('t',&MMM_BYYY);   
  35.   
  36.     MMM_BYYY.enList('t',&BMMMYY_Y);   
  37.     MMM_BYYY.enList('w',&BMMMY_YY);   
  38.        
  39.     BMMMY_YY.enList('w',&MMM_BYYY);   
  40.     BMMMY_YY.enList('d',&MY_BMMYY);   
  41.        
  42.     MY_BMMYY.enList('d',&BMMMY_YY);   
  43.     MY_BMMYY.enList('b',&BMMYY_MY);   
  44.        
  45.     BMMYY_MY.enList('b',&MY_BMMYY);   
  46.     BMMYY_MY.enList('d',&YY_BMMMY);   
  47.        
  48.     YY_BMMMY.enList('d',&BMMYY_MY);   
  49.     YY_BMMMY.enList('w',&BYYY_MMM);   
  50.        
  51.     BYYY_MMM.enList('w',&YY_BMMMY);   
  52.     BYYY_MMM.enList('t',&Y_BMMMYY);   
  53.        
  54.     Y_BMMMYY.enList('t',&BYYY_MMM);   
  55.     Y_BMMMYY.enList('s',&BMY_MMYY);   
  56.     Y_BMMMYY.enList('w',&BYY_MMMY);   
  57.     BMY_MMYY.enList('s',&Y_BMMMYY);   
  58.     BMY_MMYY.enList('b',&stop);   
  59.        
  60.     BYY_MMMY.enList('w',&Y_BMMMYY);   
  61.     BYY_MMMY.enList('t',&stop);   
  62.        
  63.     cout<<"人单独过河s 两个人过河d 野人单独过河w 两个野人过河t人带着野人过河b\n";   
  64.     cout<<"请输入:\n";    
  65.     cin>>m;   
  66.     getchar();   
  67.     if(start.start(m)==&stop) cout<<"过河成功!\n";   
  68.     else cout<<"过河失败!\n";   
  69.     getchar();   
  70.     return 1;   
  71. }   

 

 

四、实验结果

 

实验二

 

 

一、实验题目

       有限自动机也可以解决三个修道士与三个野人的过河问题。假定船最多只能载两个修道士或者野人野人服从修道士的指挥。 无论何时, 只要野人多于修道士, 野人就会吃掉修道士。 以有限自动机为基础, 编程解决三个修道士与三个野人的过河的问题。

二、问题分析

       M 表示人, W 表示野人,初始状态为"BMMMYYY_",结束状态” _BMMMYYY” 过河动作可以有五种人单独过河S 两个人过河D 野人单独过河W 两个野人过河T 人带着野人过河B

 

 

 

 

三、程序代码

源文件lab2.cpp内容

Code:
  1. #include"head.h"   
  2. // 用M 表示人 用W 表示野人 B代表船    
  3. // 初始状态为"BMMMYYY_" 终止状态为 "_BMMMYYY"    
  4. //过河动作可以有五种:人单独过河s 两个人过河d 野人单独过河w 两个野人过河t人带着野人过河b    
  5. int main_10( ){   
  6.     char m[80];   
  7.     State error(0);   
  8.     State start("start");//BMMMYYY_   
  9.     State MMMY_BYY("MMMY_BYY");//1   
  10.     State MMYY_BMY("MMYY_BMY");//2   
  11.     State BMMMYY_Y("BMMMYY_Y");//3   
  12.     State MMM_BYYY("MMM_BYYY");//4   
  13.     State BMMMY_YY("BMMMY_YY");//5   
  14.     State MY_BMMYY("MY_BMMYY");//6   
  15.     State BMMYY_MY("BMMYY_MY");//7   
  16.     State YY_BMMMY("YY_BMMMY");//8   
  17.     State BYYY_MMM("BYYY_MMM");//9   
  18.     State Y_BMMMYY("Y_BMMMYY");//10   
  19.     State BMY_MMYY("BMY_MMYY");//11   
  20.     State BYY_MMMY("BYY_MMMY");//12   
  21.     State stop("stop");//_BMMMYYY   
  22.        
  23.     start.enList('t',&MMMY_BYY);   
  24.     start.enList('b',&MMYY_BMY);   
  25.   
  26.     MMMY_BYY.enList('t',&start);   
  27.     MMMY_BYY.enList('w',&BMMMYY_Y);   
  28.   
  29.     MMYY_BMY.enList('b',&start);   
  30.     MMYY_BMY.enList('s',&BMMMYY_Y);   
  31.        
  32.     BMMMYY_Y.enList('w',&MMMY_BYY);   
  33.     BMMMYY_Y.enList('s',&MMYY_BMY);   
  34.     BMMMYY_Y.enList('t',&MMM_BYYY);   
  35.   
  36.     MMM_BYYY.enList('t',&BMMMYY_Y);   
  37.     MMM_BYYY.enList('w',&BMMMY_YY);   
  38.        
  39.     BMMMY_YY.enList('w',&MMM_BYYY);   
  40.     BMMMY_YY.enList('d',&MY_BMMYY);   
  41.        
  42.     MY_BMMYY.enList('d',&BMMMY_YY);   
  43.     MY_BMMYY.enList('b',&BMMYY_MY);   
  44.        
  45.     BMMYY_MY.enList('b',&MY_BMMYY);   
  46.     BMMYY_MY.enList('d',&YY_BMMMY);   
  47.        
  48.     YY_BMMMY.enList('d',&BMMYY_MY);   
  49.     YY_BMMMY.enList('w',&BYYY_MMM);   
  50.        
  51.     BYYY_MMM.enList('w',&YY_BMMMY);   
  52.     BYYY_MMM.enList('t',&Y_BMMMYY);   
  53.        
  54.     Y_BMMMYY.enList('t',&BYYY_MMM);   
  55.     Y_BMMMYY.enList('s',&BMY_MMYY);   
  56.     Y_BMMMYY.enList('w',&BYY_MMMY);   
  57.        
  58.     BMY_MMYY.enList('s',&Y_BMMMYY);   
  59.     BMY_MMYY.enList('b',&stop);   
  60.        
  61.     BYY_MMMY.enList('w',&Y_BMMMYY);   
  62.     BYY_MMMY.enList('t',&stop);   
  63.        
  64.     cout<<"人单独过河s 两个人过河d 野人单独过河w 两个野人过河t人带着野人过河b\n";   
  65.     cout<<"请输入:\n";    
  66.     cin>>m;   
  67.     getchar();   
  68.     if(start.start(m)==&stop) cout<<"过河成功!\n";   
  69.     else cout<<"过河失败!\n";   
  70.        
  71. //  if(start.start("twtwdbdwtwt")==&stop) cout<<"ok\n";   
  72. //  else cout<<"error\n";   
  73. //   
  74. //  if(start.start("bstwdbdwtsb")==&stop) cout<<"ok\n";   
  75. //  else cout<<"error\n";   
  76.   
  77.     getchar();   
  78.     return 1;   
  79. }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics