自动状态机实现经典过河问题------不是我不借你

一、实验题目 使用有限自动机编程解决如下问题:有一个人带着狼、羊和草来到河的左岸。左岸只有一条无人摆渡的船,这个人要从左岸过河到右岸。可是这条船最多只能装一个人和其他三者之一,否则便会沉没。如果没有人看管,狼会吃掉羊,或者羊吃掉草。问如何过河才能保证羊和草的安全?二、题目分析W代表狼,G代表草,S代表羊,M代表人。初始状态”WSGM_”,结束状态”_W...
摘要由CSDN通过智能技术生成

 

 

一、实验题目

       使用有限自动机编程解决如下问题:有一个人带着狼、羊和草来到河的左岸。左岸只有一条无人摆渡的船,这个人要从左岸过河到右岸。可是这条船最多只能装一个人和其他三者之一,否则便会沉没。如果没有人看管,狼会吃掉羊,或者羊吃掉草。问如何过河才能保证羊和草的安全?

二、题目分析

     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=this; return; }   
  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; }   <
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值