[C] Bruteforce per risolvere un esercizio di combinatoria

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
sbam
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 305
Iscrizione: giovedì 11 dicembre 2014, 20:31

[C] Bruteforce per risolvere un esercizio di combinatoria

Messaggio da sbam »

Ho scritto un pogramma per risolvere a forza bruta l'esercizio 23 di questo pdf (se siete interessati a risolverlo attenzione che ci sono anche le soluzioni).

Codice: Seleziona tutto

#include <stdio.h>
#include <stdint.h>

uint8_t tab[5][7];
const uint8_t max[][2] = {{4, 6}, {4, 4}};
uint16_t comb = 0;

void foo()
{
    static uint8_t pos[][2] = {{0, 2}, {0, 0}}, moves_left = 8;
    uint8_t i, j;

    if(!moves_left)
    {
        comb++;
    }
    else{
        tab[pos[0][0]][pos[0][1]] = 1;

        for(i = 0; i < 2; i++)
        {
            if(pos[0][i] != max[0][i])
            {
                for(j = 0; j < 2; j++)
                {
                    if(pos[1][j] != max[1][j] && !tab[pos[1][0]][pos[1][1]])
                    {
                        pos[0][i]++;
                        pos[1][j]++;
                        moves_left--;
                        foo();
                        pos[0][i]--;
                        pos[1][j]--;
                        moves_left++;
                    }
                }
            }
        }

        tab[pos[0][0]][pos[0][1]] = 0;
    }
}

int main()
{
    uint8_t i, j;

    for(i = 0; i < 5; i++)
        for(j = 0; j < 7; j++)
            tab[i][j] = 0;

    foo();

    printf("%u\n", comb);

    return 0;
}
Il problema è che il risultato calcolato dal mio programma è diverso da quello riportato nelle soluzioni ufficiali e presumo sia il primo ad essere sbagliato. Siccome è da un po' che ricontrollo ma non riesco a risolvere, qualcuno potrebbe aiutarmi?

Grazie e buona serata :)

Edit:
dò per letto il testo del problema e aggiungo qualche informazione sul mio programma: la tabella corrisponde alle sedie, l'1 vuol dire che la sedia è stata occupata da Paura, 0 che non lo è stata. Il programma utilizza una funzione ricorsiva che, dopo aver controllato che il gioco non sia terminato, crea al massimo 4 situazioni (2 movimenti di Paura * 2 di Disgusto).
Le soluzioni:
Spoiler
Mostra
1750 quella ufficiale
1925 dal mio programma
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 5 ospiti