Salve a tutti,
sto tentando di risolvere il problema numero 417 di UVA Online Judge.
Il problema dice che:
_una parola è valida se i caratteri che la compongono sono in ordine alfabetico strettamente crescente. Ad esempio "abcd" è valida, "cat" non lo è e nemmeno "aaaa".
_la lista delle parole valide è ordinata in questo modo:
codice:
a -> 1
b -> 2
.
.
z -> 26
ab -> 27
ac -> 28
.
.
az -> 51
bc -> 52
.
.
vwxyz -> 83681
Il programma riceve in input una serie di parole, e per ognuna di queste, deve stampare l'indice in questa lista ordinata (0 se la parola non è valida).
Ora, io ero partito dall'idea che la lista delle parole si potesse vedere come una specie di base 26 con dei simboli modificati, ovvero usando l'alfabeto come cifre. Però ovviamente così non funziona, perchè non tiene conto delle parole non valide.
Allora ho pensato che potesse essere risolto più facilmente in modo ricorsivo.
Se la stringa è vuota, allora vale 0. Se invece è più lunga, il suo valore è il valore del primo carattere + il valore del resto della stringa. Il valore del primo carattere è dato dal valore del carattere inteso come una cifra, moltiplicato per il valore della sua posizione in base 26.
Il valore della cifra, essendo un carattere, è il carattere meno il carattere di riferimento.
Dato che un carattere rende non validi tutti quelli precedenti, il carattere di riferimento deve avanzare ogni volta, giusto?
codice:
int convert(char* num, char zero_sym)
{
int len = strlen(num);
if (len == 0)
return 0;
else
{
char sym_val = (num[0] - zero_sym);
int head_val = sym_val * pow(26, (len - 1));
int result = head_val + convert((num + 1), num[0]);
return result;
}
}
int is_legal(char* str)
{
int len = strlen(str);
int i = 0;
for (i = 1; i < len; i++)
if (str[i] <= str[i-1]) return 0;
return 1;
}
int main()
{
char buf[10];
while (fscanf(stdin, "%s", buf) != EOF)
{
if (is_legal(buf))
printf("%d\n", convert(buf, 96));
else
printf("0\n");
}
return 0;
}
E' *quasi* giusto.
codice:
a -> 1
..
z -> 26
ab -> 27
..
az -> 51
bc -> 53 //SBAGLIATO!!!
So che ci sono vicino, ma non riesco a trovare l'errore... nessuno riesce a darmi almeno un indizio? (In effetti, preferirei un indizio ad una vera soluzione ^^)