Visualizzazione risultati 1 fino 5 di 5

Discussione: Sfida

  1. #1
    Guest

    Predefinito Sfida

    PROVATE A RISOLVERE QUESTO PROGRAMMA PERCHE IO NON CE LA FACCIO CLICCA QUI PER SAPERNE DI PIU'
    POI FATEMI SAPERE SE CI RIUSCITE
    E' INIZIATA LA SFIDA

  2. #2
    Guest

    Predefinito

    Non mi sembra poi difficilissimo.

    Si tratta di controllare ricorsivamente gli elementi della matrice che sono adiacenti a quello che stai considerando.

    Ti prepari altri array che userai per:
    - inserire le coordinate di tutti i punti trovati
    - inserire le coordinate di tutti i punti da controllare

    poi ti basta scrivere una funzione che parta da un elemento e si chieda
    "l'elemento nella riga sopra e' piu' basso?"
    Se si' controlli che non sia gia' presente nell'elenco dei punti trovati. In caso non ci sia lo aggiungi all'elenco dei punti da controllare e in quello dei punti trovati e fai lo stesso con tutti i punti adiacenti a quello che stai considerando.
    Finito il controllo togli il punto che stai considerando dalla lista di quelli da controllare

    Poi appena il programma parte aggiungi la sorgente all'elenco dei punti trovati e da controllare e lo passi alla funzione sopra descritta usando un ciclo che ti permetta di ripetere il tutto finche' ci sono elementi nell'array dei punti da controllare.

    Poi stampi l'array dei punti trovati.


    O no?

    Qualcuno piu' esperto di me?


    Ah tra parentesi: scrivere in maiuscolo equivale ad urlare. Per favore evita di farlo, grazie.

  3. #3
    Guest

    Predefinito

    la sfida consiste in scriverlo non a parlare

  4. #4
    L'avatar di Panz
    Panz non è connesso Altervistiano Junior
    Data registrazione
    01-07-2001
    Messaggi
    570

    Predefinito

    Premesso che il C non lo conosco e non l'ho mai usato (potrei provarci col basic o col turbo pascal... ma non ho il tempo adesso), lo risolverei così:

    - Scrivi 2 dove c'è la sorgente.
    - Usi la funzione che ti ha detto CoD (che controlla la quota di tutti i punti adiacenti) e la applichi in tutti i punti la cui matrice di output vale 2 o 1.
    - Usi una variabile di controllo (anche booleana) che vale 1 (o vero) se la matrice di output è stata modificata, 0 (o falso) se non hai trovato nuovi punti allagati.
    - Ricontrolli i punti allagati 1 (ma volendo anche la sorgente - punto 2 - così snellisci il programma tanto non trovi più punti del previsto, ti consiglio di comprendere quelli già allagati anche se in teoria basterebbe guardare quelli nuovi), tutte le volte che la variabile sopra vale 1. Se invece vale 0 l'acqua ha finito di espandersi e puoi passare alla stampa della matrice trovata.

    Non basta un semplice controllo perchè l'acqua potrebbe "aggirare gli ostacoli" e tornare indietro (con un controllo semplice trovi un punto ma non lo ricontrolli).

    Agli altri il codice

    EDIT: Ho trovato un sistema migliore:
    - Scrivi 2 dove c'è la sorgente.
    - Controlli la sorgente.
    - Scrivi 3 in tutti i punti trovati in cui arriva l'acqua.
    - Scorri la matrice alla ricerca dei punti 3. Se ne trovi, fai il controllo in questi punti e se ne trovi di nuovi allagati, scrivi un 3 in queste posizioni. Finito questo controllo scrivi 1 nel punto che hai appena controllato.
    - La variabile di controllo vale 1 (o vero) se hai scritto almeno una volta un 3, altrimenti 0 (o falso).
    - Se questa variabile vale 1, procedi a un nuovo controllo della matrice. In caso contrario tutti i 3 sono stati sostituiti da 1 e il lavoro è terminato.

    Con questa variante praticamente non allunghi il programma ma, per matrici grosse e computer lenti, gira molto più in fretta.
    Ultima modifica di Panz : 30-11-2004 alle ore 14.22.32
    Panz.

    C'è sempre qualcuno che è più potente di te. Allora, quando lo incontri, fai in modo che sia dalla tua parte.


  5. #5
    Guest

    Predefinito

    A me il problema sembra poco chiaro, perché dice che l'acqua può scendere in tutte le direzioni, ciò vuol dire che deve occupare di volta in volta tutte e 5 le caselle adiacenti, però nell'esempio ciò non accade.

    Svelato il mistero la cosa é semplicissima: ti fai una funzione che accetta in input la matrice ed un intero che indica la direzione in cui deve scrivere il numero.
    Poi richiami ricorsivamente la funzione fin quando non raggiungi le parti basse.

    Parlarne é semplice, ma farlo lo é ancor di più...

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •