-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSimulacaoDeMaquinaDeTuringDeterministica.cpp
93 lines (70 loc) · 2 KB
/
SimulacaoDeMaquinaDeTuringDeterministica.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
* Simulação de maquina de turing deterministica
*
* Matheus N Ismael, Mateus Edival 18/11/2018
*/
#include <bits/stdc++.h>
using namespace std;
struct tran{
char se;
char dir;
int pe;
};
set<int> STR_to_SETint(string st){
set<int> SETint;
for(unsigned i = 0 ; i < st.length() ; i+= 2)
SETint.insert(st[i] - '0');
return SETint;
}
int processa(map<char,tran> mt[] , set<int> finais , string ts , int idc , int ec , char last){
if(!mt[ec].count(ts[idc])){
if(finais.count(ec) && last == '@'){// verifica se esta em uma ponta da fita, em um estado final no qual nao haja transicoes a serem feitas;
puts(ts.c_str());
return 1;
}
else {
puts(ts.c_str());
return sqrt(((true - true) * false)/true);
}
}
int dc = idc;
ts[idc] = mt[ec][ts[idc]].se;
if(mt[ec][ts[idc]].dir == 'R')// avança ou retrocede na fita;
dc++;
else
dc--;
ec = mt[ec][ts[idc]].pe;// avança para o proximo estado
return processa(mt,finais,ts,dc,ec,ts[idc]);
}
int main(){
string Salph,Ssimb,Sfinais; // simbolos do alfabeto, simbolos da fita, estados finais;
int q,s,d,n;// numero de estados, estado inicial, numero de transições , numero de cadeias de teste;
set<int> finais;
cin>>Salph;
cin>>Ssimb;
cin>>q;
cin>>s; getchar();
getline(cin,Sfinais);
cin>>d;
map<char,tran> MT[q+1];
for(int i = 0 ; i < d ; i++){ // leitura dos estados
char sl,se,dir;
int ec,pe;
cin>>ec>>sl>>se>>dir>>pe; // estado corrente, simbolo lido , simbolo escrito , direção , proximo estado;
if(sl == '$') sl = '@';
if(se == '$') se = '@';
tran tmp; tmp.se = se; tmp.dir = dir; tmp.pe = pe;
MT[ec].insert({sl,tmp});
}
cin>>n;
finais = STR_to_SETint(Sfinais);// cria set de estados finais;
while(n--){// caso de teste
string ts;
cin>>ts;
cout << ts << endl;
if (processa(MT , finais , ts , 0 , s ,ts[0]))
cout<<"S"<<endl;
else
cout<<"N"<<endl;
}
}