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;
}
Ultima modifica 5 Febbraio 2022