Sto cercando di implementare il 24 Game in ansi C. Questo gioco è il seguente:
Per un elenco di quattro numeri dati, prova a trovare una soluzione che coinvolga questi quattro numeri, che, usando addizione (+), sottrazione (-), moltiplicazione (*) e divisione (/) finisca a 24. Ogni numero può apparire solo una volta, ma l'ordine dei numeri potrebbe essere cambiato naturalmente. È possibile usare parentesi per cambiare l'ordine degli operandi (e devi farlo per molte delle soluzioni).
Volevo costruire sopra a questo problema e inventare un gioco M , dove M può essere un numero arbitrario, e puoi dare una lista N di lunghezza arbitraria di valori.
Quello che so:
- Gli operatori possono essere riutilizzati più volte nella formula. Pertanto, durante l'iterazione degli operatori, posso semplicemente utilizzare i flag per verificare se un determinato operatore debba essere utilizzato in un determinato luogo.
- I numeri possono essere utilizzati solo una volta. Esistono fantastici tutorial là fuori che spiegano come permutare un array finché tutti i diversi ordini non sono stati esauriti.
Tuttavia, ciò di cui sto ancora avendo problemi, è come decidere le diverse combinazioni di operatori.
Dire che ho una funzione
op(A, B)
Questa funzione non è commutativa, ad es. op (A, B)! = op (B, A). Ora, se ho quattro valori, voglio sapere in che modo ho bisogno di combinare queste funzioni. So che la sequenza di numeri catalani ci dice quante opzioni ci sono. (per quattro numeri, ci sono 5 sequenze ). Questi sono:
- op (A, op (B, op (C, D)))
- op (op (op (A, B), C), D)
- op (op (A, op (B, C), D))
- op (A, op (op (B, C), D))
- op (op (A, B), op (C, D))
Usando un semplice bitVector con ricorsione riesco a trovare i primi quattro. Ma non il quinto, in cui due nodi condividono lo stesso "livello".
Esiste un modo iterativo per testare tutte queste diverse opzioni?
Oppure, come Ordous giustamente dice:
come enumerare / generare tutti gli alberi binari possibili da N foglie e N-1 nodi?