Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475

    [Algoritmo - C] Indice di una lista ordinata di parole

    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 ^^)
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  2. #2
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    ciao, provo a dare un'occhiata al codice anche se qualche punto non mi è ben chiaro!
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.