Pizzini - 2008 D=1

L'esercizio del 2008 della fase regionale è categorizzato come semplice D=1, ma oggettivamente ci sono alcune finezze che possono mettere in difficoltà l'alunno più giovane soprattutto dal punto di vista codice/tecnico nel momento che si contano le occorrenze dei caratteri ovvero dei numeri. Da ricordare con attenzione lo stratagemma  del -'0' che altri non è che la differenza tra codice ascii tra caratteri e numeri che scostano di 48 posizioni.

 

#include<stdio.h>
#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <string>

using namespace std;

int N;
char codice[100][80];

/** funzioni di supporto */

/** controllo se date due parole sono l'una anagramma dell'altro */
bool isAnagramma(char _parola1[80], char _parola2[80]) /** indice della parola*/
{
    //cout <<_parola1 <<" anagramma di " <<_parola2 <<endl;
    int occorrenzecifra[10] = {0}; /** quante volte compare la cifra i-sima?*/
    int cifra = 0;
    for (int i=0; _parola1[i] != '\0'; i++) /** '\0' è il carattere vuoto! */
    {
        /** prelevo una cifra alla volta e aggiungo +1 al numero delle sue occorrenze*/
        cifra = _parola1[i] -'0'; /** retaggio ascii -48 oppure -'0' senza int*/
        occorrenzecifra[cifra] ++;
        //cout << cifra << ": "<<occorrenzecifra[cifra]<<endl;
    }

    /** adesso conto che sulla seconda parola ci siano le stesse occorrenze */
    for (int i=0; _parola2[i] != '\0'; i++)
    {
        cifra = _parola2[i] - '0';
        occorrenzecifra[cifra]--;
    }

    /** adesso controllo il vettore delle occorrenze: deve essere tutto a zero!*/
    for (int i=0; i < 10; i++)
    {
        if (occorrenzecifra[i] != 0)
        {
            return false;
        }

    }

    return true;
}

int main()
{
    /** VARIABILI */
    fstream fin;
    fstream fout;

    int p = 0;

    fin.open("input.txt", ios::in);
    fout.open("output.txt", ios::out);

    /** lettura file*/
    fin >> N;
    for (int i=0; i < N; i++)
    {
        fin >> codice[i];
    }

    for (int i=0; i < N; i++)
    {
        p = 0;
        for (int j=0; j < N; j++)
        {
            if (isAnagramma(codice[i], codice[j]))
            {
                cout <<codice[i] <<" è anagramma di " <<codice[j] <<endl;
                p++;
            }
        }
        fout << codice[i][p-1];
    }

    fin.close();
    fout.close();

    return 0;
}

Stampa