Programozás‎ > ‎Feladatok‎ > ‎Varázslat‎ > ‎Megoldás‎ > ‎

og_varazslat.cpp

Letöltés: og_varazslat.cpp

#include <cstdio>
#include <iostream>
 
using namespace std;
 
void beolvas(char*);
void work(int);
void kiir(char*, int);
int n;
 
int comb;
char** combs;
int op;
char** ops;
int w;
char* wss;
int lis;
char* list;
 
int main ()
{
 beolvas("m1.in");
}
 
void beolvas(char* file)
{
    FILE* be=fopen(file,"r");
    fscanf(be,"%d", &n);
    for(int i=0; i<n; i++)
    {
        char c;
        fscanf(be, "%d",&comb);
 
        combs= new char*[comb];
        for (int j=0; j<comb; j++)
        {
            combs[j] = new char[3];
            fscanf(be, "%c", &c);
            fscanf(be, "%c", &combs[j][0]);
            fscanf(be, "%c", &combs[j][1]);
            fscanf(be, "%c", &combs[j][2]);
        }
        fscanf(be, "%d", &op);
        ops = new char*[op];
        for (int j=0; j<op; j++)
        {
            ops[j] = new char[2];
            fscanf(be, "%c", &c);
            fscanf(be, "%c", &ops[j][0]);
            fscanf(be, "%c", &ops[j][1]);
                    ops[j][2]='\0';
        }
        fscanf(be, "%d", &w);
        wss = new char[w+1];
        fscanf(be, "%c", &c);
        for (int j=0; j<w; j++)
        {
            fscanf(be, "%c", &wss[j]);
        }
        wss[w]='\0';
        list= new char[w];
        lis=0;
        work(0);
        kiir("OGm1.out",i);
    }
    fclose(be);
}
 
void work(int count)
{
    if (count==w) {return;}
    list[lis]=wss[count];
    if(lis>0)
    {
    for(int i=0; i<comb; i++)
    {
        if ((list[lis]==combs[i][0]) 
            && (list[lis-1]==combs[i][1])) 
        { lis--; list[lis]=combs[i][2];}
        else if ((list[lis]==combs[i][1]) 
                && (list[lis-1]==combs[i][0])) 
        { lis--; list[lis]=combs[i][2];}
 
    }
    }
    if(lis>0)
    {
    bool b=true;
    for(int i=0; i<op && b; i++)
    {
        if (list[lis]==ops[i][0])
        {
             for(int j=0; j<lis && b; j++)
             {
                 if(list[j]==ops[i][1]) {lis=-1; b=false;}
             }
        }
        else if (list[lis]==ops[i][1])
        {
             for(int j=0; j<lis && b; j++)
             {
                 if(list[j]==ops[i][0]) {lis=-1; b=false;}
             }
        }
    }
    }
    lis++;
    work(count+1);
}
 
void kiir(char* file,int i)
{
    if (i==0)
    {
    FILE* torol = fopen(file,"w");
    fclose(torol);
    }
    FILE* ki = fopen(file,"a");
    fprintf(ki, "Case #%d: [", i+1);
    if(lis==0) {fprintf(ki, "]\n");}
    else
    {
    for(int j=0; j<lis-1; j++)
    {
        fprintf(ki, "%c, ", list[j]);
    }
    fprintf(ki, "%c]\n", list[lis-1]);
    }
    fclose(ki);
}