不确定的有穷自动机的确定化代码-(子集法)
来源:互联网 发布:程序员中级考试 答案 编辑:程序博客网 时间:2024/06/05 20:13
/* 输入:多组测试数据,开始节点d,经过条件b,结束节点c,中间以空格隔开,0 0 0表示每组输入结束 样例输入: 0 a 1 0 a 2 0 b 1 1 a 3 1 a 4 2 a 1 0 0 0 解题思路:构造子集T 0 a b a{1,2}T0 b{1}T1 T0 a{1,3,4}T2 T1 a{3,4}T3 T2 a{3,4}T3 由子集表生成新的连接图。 T0 a T2 T1 a T3 T2 a T3*/#include <cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<set>#include<string>#include<vector>int k,k1=0; //k用来记录输入的路径条数,k1用来记录新生成的图路径条数char d, b, c; //临时存储,输入的三个操作数using namespace std;struct point{ char start; char deal; char end;};bool comp(const point &a, const point &b){ if(a.start==b.start) return a.deal<b.deal; return a.start<b.start;}void myscanf(point *a){ while(d!='0'||b!='0'||c!='0') { a[k].start = d; a[k].deal = b; a[k++].end = c; scanf("%c %c %c", &d, &b, &c); getchar(); }}void initial(point *a, set<string> &T, vector<string> &cpT){ for(int i=0; i<k; i++) { if(a[i].start==a[0].start) { if(T.empty()) //子集T中还没有元素,则把a1加入T { string str; str.push_back(a[i].deal); str.push_back(a[i].end); T.insert(str); cpT.push_back(str); //把子集T复制到cpT中 } else { bool boo=true; //判断子集T中是否出现过deal(a) set<string>::iterator it; for(it=T.begin(); it!=T.end(); ++it) { string str0 = *it; if(str0[0]==a[i].deal) { boo = false; break; } } if(boo) //子集T中没出现过deal(a) { string str; str.push_back(a[i].deal); str.push_back(a[i].end); cpT.push_back(str); T.insert(str); } else //子集T中出现过deal(a) { string str1 = *it; str1.push_back(a[i].end); sort(str1.begin()+1,str1.end()); T.erase(it); T.insert(str1); cpT.push_back(str1); } } } else break; }}void iteratorT(point *a, point *printa, set<string> &T, vector<string> &cpT){ int t; set<string>::iterator it0; set<string> T1; char z='0'; for(it0=T.begin(); it0!=T.end(); ++it0) { string str2 = *it0; int j=0; t=0; for(int i=1; i<str2.size(); i++) { for(; j<k; j++) { if(a[j].start==str2[i]) { if(t==0) { string str3; str3.push_back(a[j].deal); str3.push_back(a[j].end); T1.insert(str3); t++; } else { bool boo2=true; set<string>::iterator it1; for(it1=T1.begin(); it1!=T1.end(); ++it1) { string str3=*it1; if(str3[0]==a[j].deal) { boo2 = false; break; } } if(boo2) { string str4; str4.push_back(a[j].deal); str4.push_back(a[j].end); T1.insert(str4); } else { string str5 = *it1; str5.push_back(a[j].end); sort(str5.begin()+1,str5.end()); T1.erase(it1); T1.insert(str5); } } } else if(t) break; } } set<string>::iterator its; for(its=T1.begin(); its!=T1.end(); ++its) { string str6 = *its; if(T.find(str6)!=T.end()) { printa[k1].start = z; printa[k1].deal = str6[0]; for(int i=0; i<cpT.size();i++) { if(str6.compare(cpT[i])==0) printa[k1++].end = i-1+48; } } else { printa[k1].start = z; printa[k1].deal = str6[0]; printa[k1++].end = cpT.size()-1+48; cpT.push_back(*its); } T.insert(str6); } if(!T1.empty()) z++; T1.clear(); }}void mprintf(set<string> &T, point *printa){ printf("\n"); set<string>::iterator it2; for(it2=T.begin(); it2!=T.end(); ++it2) cout<<*it2<<endl; printf("\n"); for(int i=0; i<k1; i++) printf("%c %c %c\n", printa[i].start, printa[i].deal, printa[i].end);}int main(){ point a[105]; point printa[105]; while((scanf("%c %c %c", &d, &b, &c))!=EOF) { k=0; getchar(); memset(a, 0, sizeof(a)); myscanf(a); sort(a, a+k, comp); //对输入路径,按开始节点升序排列,后序处理减少遍历次数 set<string> T; //保存构造的子集T,利用set的无重复元素特点 vector<string> cpT; //复制子集T中的元素(set会对元素进行排序)用来记录子集的序号 initial(a, T, cpT); //初始化,构造0(开始符号)的子集 iteratorT(a, printa, T, cpT); //由初始子集开始迭代,直到没有新的子集产生 mprintf(T,printa); } return 0;}
0 0
- 不确定的有穷自动机的确定化代码-(子集法)
- 不确定的有穷自动机N的确定化
- 不确定有穷自动机正则表达式求值
- 确定有穷自动机测试代码
- CMMB的确定及不确定因素
- 不确定有穷自动机 NFA 与 隐马尔可夫模型 HMM 比较
- 有穷自动机的构造实验
- 有穷自动机的相关概念
- 有穷自动机
- 有穷自动机
- NFA的确定化
- java实现的有穷状态自动机(FA)
- 确定的有穷自动机正则表达式求值
- 自动机理论、语言和计算导论---有穷自动机:确定型有穷自动机(DFA)
- 自己动手开发编译器(三)有穷自动机
- 编译原理实验2——自动机的确定化和最小化
- 由非确定自动机转为确定自动机的子集法
- 编译原理-DFA有穷自动机 词法分析应用于O(n)的单词匹配
- C++ Virtial
- monkey
- 使用PHP将Mysql数据表导出到Excel中
- ionic2数据库SQLite查询操作
- caffe-windows(CPU)配置与利用mnist数据集训练第一个caffemodel
- 不确定的有穷自动机的确定化代码-(子集法)
- string.split 匹配一个多个空格分割成string数组
- seq2seq 预测时 feed 自己的数据 (接上文)
- Linux添加/删除用户和用户组
- 一天搞定CSS:表格(table)--19
- 4-RabbitMQ交换机-direct
- 系统编程二
- 【C++后台开发面试】Linux系统相关
- pandoc md 文件转化pdf(中文字体)