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

mb_varazslat.cpp

Letöltés: mb_varazslat.cpp

#include "stdafx.h"
#include <cstdlib>
#include <cstdio>
#include <list>
#include <vector>

using namespace std;

int db;
int c, d, n;

char comb1 [200];
char comb2 [200];
char comb3 [200];

char op1[200];
char op2[200];

char str[200];

char tmp;

int _tmain()
{
    FILE* reader = fopen("input.txt", "r");
    FILE* printer = fopen("output.txt", "w");
    fscanf(reader, "%d", &db);
   
    for(int i=0; i<db; i++)
    {
        //printf("Doing #%d\n", i);
        fscanf(reader, "%d%c", &c, &tmp);
        for(int j=0; j<c; j++)
            fscanf(reader, "%c%c%c%c", &comb1[j], &comb2[j], &comb3[j], &tmp);
       
        fscanf(reader, "%d%c", &d, &tmp);
        for(int j=0; j<d; j++)
            fscanf(reader, "%c%c%c", &op1[j], &op2[j], &tmp);
       
        fscanf(reader, "%d%c", &n, &tmp);
        for(int j=0; j<n; j++)
            fscanf(reader, "%c", &str[j]);

       
        vector<char> l;
        for(int j=0; j<n; j++)
        {
            l.push_back(str[j]);

            bool cont = true;
            while(cont)
            {
                cont = false;
                if(l.size()>=2)
                {
                    char c1=l[l.size()-1];
                    char c2=l[l.size()-2];

                    for(int k=0; k<c; k++)
                        if((comb1[k] == c1 && comb2[k] == c2) ||
                            (comb1[k] == c2 && comb2[k] == c1))

                        {
                            cont=true;
                            l.pop_back();
                            l.pop_back();
                            l.push_back(comb3[k]);
                            //printf("comb (%c %c => %c)", comb1[k], comb2[k], comb3[k]);
                            break;
                        }
                }
            }

            if(l.size()>=2)
            {
                char c1, c2;
                for(int k1=0; k1<l.size(); k1++)
                    for(int k2=0; k2<l.size(); k2++)
                        if(k1!=k2)
                        {
                            c1=l[k1];
                            c2=l[k2];

                            for(int k=0; k<d; k++)
                                if((op1[k] == c1 && op2[k] == c2) ||
                                    (op1[k] == c2 && op2[k] == c1))

                                {
                                    l.clear();
                                    //printf("op (%c %c)", c1, c2);
                                    break;
                                }
                        }
            }
        }

        printf("Case #%d: ", i+1);
        for(int j=0; j<l.size(); j++)
            printf("%c", l[j]);
        printf("\n");
    }

    fclose(printer);
    fclose(reader);

    scanf("%d", db);
    return 0;
}