Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cstdlib>
- #include <string>
- #include <queue>
- #include <set>
- using namespace std;
- /*
- Funkcija koju poziva ispitni sustav SPPRUT.
- Nemojte mijenjati:
- - naziv datoteke
- - naziv funkcije
- - broj ulaznih parametara
- - tipove ulaznih parametara
- - tip povratne vrijednosti
- Ulazni parametri:
- definicijaPA: string s definicijom funkcije prijelaza PA
- oblikovan prema uputama na FERWebu
- ulazniNiz: string s nizom znakova za koji PA provjerava da li se prihvaca
- Povratna vrijednost:
- int: 1 ako PA prihvaca niz
- 0 ako PA ne prihvaca niz
- */
- int utrlab2(char* definicijaPA, char* ulazniNiz) {
- string stanja[50];
- string dPa(definicijaPA);
- string s(dPa.substr(1,dPa.find('%')-1));
- int brojac=0;
- string s2;
- for(int i=0;i<s.size();i++){
- if(s[i]==','){
- stanja[brojac++]=s2;
- //cout<<"ovo je jedno od svih stanja:"<<s2<<endl;
- s2.clear();
- }
- else
- s2+=s[i];
- }
- stanja[brojac++]=s2;
- //cout<<"ovo je jedno od svih stanja:"<<s2<<endl;
- //èitanje drugog reda: dozvoljeni ulazni znakovi
- s.clear();
- s2.clear();
- dPa.erase(0,dPa.find('%'));
- s=dPa.substr(1,dPa.find('%')-1);
- int brojac2=0;
- string znak[100];
- for(int i=0;i<s.size();i++){
- if(s[i]==','){
- znak[brojac2++]=s2;
- //cout<<"ovo je jedno od svih znakova:"<<s2<<endl;
- s2.clear();
- }
- else
- s2+=s[i];
- }
- znak[brojac2++]=s2;
- znak[brojac2++]='$';
- //cout<<"ovo je jedno od svih znakova:"<<s2<<endl;
- // èitanje treæeg reda: sva prihvatljiva stanja
- s.clear();
- s2.clear();
- dPa.erase(0,dPa.find('%'));
- s=dPa.substr(1,dPa.find('%')-1);
- int brojac3=0;
- string znak_stog[100];
- for(int i=0;i<s.size();i++){
- if(s[i]==','){
- znak_stog[brojac3++]=s2;
- // cout<<"ovo je jedno od svih Prih stanja:"<<s2<<endl;
- s2.clear();
- }
- else
- s2+=s[i];
- }
- znak_stog[brojac3++]=s2;
- s.clear();
- s2.clear();
- dPa.erase(0,dPa.find('%'));
- string poc_stanje(dPa.substr(1,dPa.find('%')-1)); // POCETNO STANJE
- dPa.erase(0,dPa.find('%'));
- string DNO(dPa.substr(1,dPa.find('%')-1)); // DNO STOGA
- dPa.erase(0,dPa.find('%'));
- s=dPa.substr(1,dPa.find('%')-1);
- int brojac4=0;
- string prih_stanja[100];
- for(int i=0;i<s.size();i++){
- if(s[i]==','){
- prih_stanja[brojac4++]=s2;
- // cout<<"ovo je jedno od svih Prih stanja:"<<s2<<endl;
- s2.clear();
- }
- else
- s2+=s[i];
- }
- prih_stanja[brojac4++]=s2;
- struct matrica{
- int niz[100];
- string stog[100];
- int br;
- };
- matrica mat[brojac+10][brojac2+10][brojac3+10]; // MATRICA PRIJELAZA stanje, znak, stog znak!
- for(int i=0;i<brojac+10;i++)
- for(int j=0;j<brojac2+10;j++)
- for(int k=0;k<brojac3+10;k++)
- mat[i][j][k].br=0;
- s.clear();
- s2.clear();
- //cout<<"TABLICA PRIJELAZA: "<<endl;
- int velicina=dPa.size()-1-dPa.find('%');
- while(velicina>0){
- s.clear();
- s2.clear();
- dPa.erase(0,dPa.find('%'));
- velicina=dPa.size()-1;
- s=dPa.substr(1,dPa.find('%')-1);
- if(s.size()==0) continue;
- string zn,st;
- int brojac5=0;
- while(s[brojac5++]!=',') //stanje iz kojeg idemo
- s2+=s[brojac5-1];
- zn=s[brojac5]; //ulazni znak
- st=s[brojac5+2];
- brojac5+=5; //pomicemo na sljedece stanje;
- int x,y,zz, z,z2;
- for(int i=0;i<brojac;i++)
- if(!s2.compare(stanja[i])){
- x=i;
- break;
- }
- else if(i==brojac-1 )
- return 0;
- //cout<<"1_Stanje ne postoji:"<< s2 <<endl;
- for(int i=0;i<brojac2;i++)
- if(!zn.compare(znak[i])){
- y=i;
- break;
- }
- else if(i==brojac2-1)
- return 0;
- //cout<<"1_Znak ne postoji"<< zn <<endl;
- for(int i=0;i<brojac3;i++)
- if(!st.compare(znak_stog[i])){
- zz=i;
- break;
- }
- else if(i==brojac3-1)
- return 0;
- //cout<<"1_Znak ne postoji"<< zn <<endl;
- string s3;
- while(brojac5<s.size()){
- if(s[brojac5++]==','){
- //cout<<"--> "<<s3<<endl;
- for(int i=0;i<brojac;i++)
- if(!s3.compare(stanja[i])){
- z=i;
- break;
- }
- else if(i==brojac-1)
- return 0;
- //cout<<"2_Stanje u koje želimo prijeći ne postoji:"<< s3 <<endl;
- //cout<<"Dosao"<<x <<" "<< y<<" "<< z<< "Brojac brojac2:"<<brojac<<" "<< brojac2<<endl;
- mat[x][y][zz].niz[mat[x][y][zz].br++]=z; // spremamo u tablicu indekse stanja u koja mozemo prijeci
- s3.clear();
- while(s[brojac5++]!='#')
- s3+=s[brojac5-1];
- mat[x][y][zz].stog[mat[x][y][zz].br-1]=s3;
- s3.clear();
- }
- else{
- s3+=s[brojac5-1]; //ucitavamo stanje u koje prelazimo
- }
- }
- //cout<<"--> "<<s3<<endl;
- /* SIGURNO CE SVE OBUHVATITI
- for(int i=0;i<brojac;i++)
- if(!s3.compare(stanja[i])){
- z=i;
- break;
- }
- else if(i==brojac-1)
- // cout<<"3_Stanje u koje želimo prijeći ne postoji:"<< s3 <<endl;
- mat[x][y].niz[mat[x][y].br++]=z; // spremamo u tablicu indekse stanja u koja mozemo prijeci
- s3.clear();*/
- }
- // DO TUDA BI SVE TREBALO BITI OK, SADA UCITAVANJE
- s.clear();
- s2.clear();
- s.assign(ulazniNiz);
- struct podre {
- string stanje;
- string slovo;
- };
- //friend bool operator==(const pod_red& q1, const pod_red& q2);
- /*pod_red pod_red::operator==(pod_red &other){
- return !stanje.compare(other.stanje) && !slovo.compare(other.slovo);
- }*/
- /*bool pod_red::operator==(const pod_red &other) const {
- return !stanje.compare(other.stanje) && !slovo.compare(other.slovo);
- }*/
- /*bool operator==(const pod_red& q1, const pod_red& q2){
- if( q1.stanje.compare(q2.stanje) + q1.slovo.compare(q2.slovo)==0)
- return true;
- else
- return false;
- */
- podre pomocni;
- queue <podre> red;
- /* queue <podre> red_pom;
- pomocni.stanje=poc_stanje;
- pomocni.slovo= DNO;
- red.push(pomocni); // inicijalizacija reda
- red_pom.push(pomocni);
- int n=1; // brojac kretanja u queue
- set <pod_red> kopije;
- kopije.insert(pomocni);
- if(s.size()==0) continue; // ?????????????????????????????????????????????? Rijesiti ovo!
- //cout<<"\nULAZNI NIZ: "<<s<<endl;
- //cout<<"Pocetno stanje >>> "<<poc_stanje<<" <<<"<<endl;
- string zn="$";
- while(!red_pom. empty()){
- string s3,s33;
- pomocni=red_pom.front();
- s3=pomocni.stanje;
- s33=pomocni.slovo;
- red_pom.pop();
- int x,y,z;
- for(int i=0;i<brojac;i++) // trazenje stanja, zatim znaka
- if(!s3.compare(stanja[i])){
- x=i;
- break;
- }
- else if(i==brojac-1)
- return 0;
- cout<<"5_Stanje ne postoji:"<< s2 <<endl;
- for(int i=0;i<brojac3;i++) // trazenje stanja, zatim znaka
- if(!s33.compare(znak_stog[i])){
- z=i;
- break;
- }
- else if(i==brojac3-1)
- return 0;
- cout<<"5_Stanje ne postoji:"<< s2 <<endl;
- int prov=0;
- for(int i=0;i<brojac2;i++)
- if(!zn.compare(znak[i])){
- y=i;
- break;
- }
- else if(i==brojac2-1){
- cout<<"Nema epsilon prijelaza iz pocetnog stanja "<<endl;
- prov=1;
- }
- if(prov) continue;
- for(int i=0;i<mat[x][y][z].br;i++){ // dodajemo stanja u red
- pomocni.stanje=stanja[mat[x][y][z].niz[i]];
- pomocni.slovo= mat[x][y][z].stog[i];
- set <pod_red>::iterator it;
- int pp=0;
- for(it=kopije.begin();it!=kopije.end;it++){
- if(!pomocni.stanje.compare(it*.stanje) && !pomocni.slovo.compare(it*.slovo)){
- pp=1;
- break;
- }
- }
- if(pp) // nasao ga je! To je duplic! Ne dodajemo
- continue;
- kopije.insert(pomocni);
- red.push(pomocni);
- red_pom.push(pomocni);
- n++;
- cout<<"Epsilon prijelaz: "<<stanja[mat[x][y].niz[i]] << endl;
- }
- }
- int x,y,pomocna,prihvaceno=0,greska=0;
- for(int k=0;k<s.size();k++){
- zn=s[k];
- kopije.clear();
- cout<<">>Citam novi znak: ( "<<zn<<" )"<<endl;
- pomocna=0;
- for(int j=0;j<n;j++){
- s2=red.front();
- red.pop();
- //cout<< "IZ ovog stanja idemo "<<s2<<endl;
- for(int i=0;i<brojac;i++) // trazenje stanja, zatim znaka
- if(!s2.compare(stanja[i])){
- x=i;
- break;
- }
- else if(i==brojac-1)
- cout<<"Stanje ne postoji:"<< s2 <<endl;
- for(int i=0;i<brojac2;i++)
- if(!zn.compare(znak[i])){
- y=i;
- break;
- }
- else if(i==brojac2-1){
- if(zn.compare(" ")){
- cout<<"Znak ne postoji! >>> "<< zn <<endl;
- greska=1;
- }
- else{
- zn="$";
- for(int ii=0;ii<brojac2;ii++)
- if(!zn.compare(znak[ii])){
- y=ii;
- break;
- }
- string s5;
- s5=stanja[mat[x][y].niz[i]];
- for(int m=0;m<brojac3;m++)
- if(!prih_stanja[m].compare(s5)){
- prihvaceno=1;
- break;
- }
- }
- }
- if(greska) break;
- //cout<<"pomocna prije: "<<pomocna<<endl;
- pomocna+=mat[x][y].br;
- //cout<<"pomocna poslije: "<<pomocna<<endl;
- for(int i=0;i<mat[x][y].br;i++){ // dodajemo stanja u red
- if(kopije.find(stanja[mat[x][y].niz[i]])!=kopije.end()){ // nasao ga je! To je duplic! Ne dodajemo
- pomocna--;
- continue;
- }
- kopije.insert(stanja[mat[x][y].niz[i]]);
- red.push(stanja[mat[x][y].niz[i]]);
- red_pom.push(stanja[mat[x][y].niz[i]]);
- cout<<"Prelazim -->"<<stanja[mat[x][y].niz[i]] << endl;
- if(k==s.size()-1){
- //cout<<"Usli smo u zadnje stanje"<<endl;
- string s5;
- s5=stanja[mat[x][y].niz[i]];
- for(int m=0;m<brojac3;m++)
- if(!prih_stanja[m].compare(s5)){
- prihvaceno=1;
- break;
- }
- }
- }
- }
- if(greska) break;
- n=pomocna;
- zn='$';
- while(!red_pom.empty()){
- string s3;
- s3=red_pom.front();
- red_pom.pop();
- int x,y;
- for(int i=0;i<brojac;i++) // trazenje stanja, zatim znaka
- if(!s3.compare(stanja[i])){
- x=i;
- break;
- }
- else if(i==brojac-1)
- cout<<"Stanje ne postoji:"<< s2 <<endl;
- int prov=0;
- for(int i=0;i<brojac2;i++)
- if(!zn.compare(znak[i])){
- y=i;
- break;
- }
- else if(i==brojac2-1){
- //cout<<"Nema epsilon prijelaza "<< zn <<endl;
- prov=1;
- }
- if(prov) continue;
- for(int i=0;i<mat[x][y].br;i++){ // dodajemo stanja u red
- if(kopije.find(stanja[mat[x][y].niz[i]])!=kopije.end()) // nasao ga je! To je duplic! Ne dodajemo
- continue;
- kopije.insert(stanja[mat[x][y].niz[i]]);
- red.push(stanja[mat[x][y].niz[i]]);
- red_pom.push(stanja[mat[x][y].niz[i]]);
- n++;
- cout<<"Epsilon prijelaz: "<<stanja[mat[x][y].niz[i]] << endl;
- if(k==s.size()-1){
- //cout<<"Usli smo EPSILON prijelazom u jedno od zadnjih stanja"<<endl;
- string s5;
- s5=stanja[mat[x][y].niz[i]];
- for(int m=0;m<brojac3;m++)
- if(!prih_stanja[m].compare(s5)){
- prihvaceno=1;
- break;
- }
- }
- }
- }
- }
- if(prihvaceno) cout<<"PRIHVACA se ulazni niz"<<endl;
- else cout<<"NE PRIHVACA se ulazni niz"<<endl;
- */
- return 1;
- }
- int main(){
- char def[100], ulaz[100];
- scanf("%s %s", def,ulaz);
- printf("Rjesenje: %d",utrlab2( def, ulaz));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement