PDA

View Full Version : Gioco quasi impossibile piega francobolli


kevinpirola
04-04-2012, 16:31
Ecco il testo del quesisto (tratto da un gioco per android):

I francobolli vanno considerati come bianchi da entrambi i lati. Due francobolli possono essere ripiegati in un solo modo, tre francobolli in due modi, quattro francobolli in cinque modi. In quanti modi diversi può essere ripiegata una striscia di 7 francobolli?


Non riesco a giungere ad un risultato accettabile.

Premessa. Ho ipotizzato che una piega oraria venga contata con 0 e una antioraria con 1.

Ogni combinazione di pieghe può essere interpretata con una sequenza binaria.

Esempio per 3 francobolli:

00 (due pieghe orarie) perciò la forma dei fb è una specie di spirale.
01 (una piega oraria e una anti) la forma dei fb piegati è una specie di z.

Basandosi su questa affermazione si potrebbe ipotizzare che le combinazioni 11 (che è la NOT di 00) e la 10 (che è la NOT di 01) possano essere eliminate.

Potrebbe anche sembrare che la 01 e la 10 che sono semplicemente anche inverse in ordine siano equivalenti.

Altro inghippo è il tipo di piega, che può essere interna (cioè senza 'scavallare' nessun altra piega) oppure esterna ('scavallando' una o più pieghe). Ad ogni combinazione binara perciò esistono più rappresentazioni figurate delle piegature.
Esempio 1.0.0 se li disegno su un foglio eseguirò:
una riga verticale dall'alto verso il basso, una piega antioraria (quindi una riga verso l'alto) una piega oraria (una riga verso il basso) e un'ulteriore piega oraria potrà andare ad infilarsi sia tra le ultime due pieghe, sia scavallando la piega in modo che l'ultimo francobollo ricopra il primo.


E' però facilmente dimostrabile che 100 e 001 (cioè le pieghe di 4 francobolli) sono ancora equivalenti; ognuno genera due figure che sono equivalenti (speculari) alle due generate dall'altra combinazione.


Non è invece vero che 010000 e 000010 (cioè le pieghe di 7 francobolli) sono equivalenti, nel primo caso infatti le figure generate sono 5 e nel secondo sono 4. Le quattro del secondo sono tutte congruenti a 4 del primo, che però ne aggiunge una.

Perciò non è facilmente eliminabile il caso la sequenza sia il "reverse", perchè non posso eliminarla in tronco, non essendo perfettamente equivalenti, ma non posso tenerla perchè ogni figura deve essere contata solo una volta.


L'idea che inizialmente mi è venuta è questa:

partendo da una piega (0 oppure 1) se la successiva è opposta (1 oppure 0) allora non sarà mai possibile avere situazioni "doppie" in cui la piega può essere disegnata. Il disegno sarà sempre uno zig-zag.

Il problema sussiste con due pieghe dello stesso tipo in sequenza. La seconda piega dello stesso tipo può essere "infilata" in ognuna delle "conche" nello zig-zag generate dalle precedenti pieghe di quel tipo.

Nel caso di due pieghe successive allora andrò a contare quante ne ho già effettutate dello stesso tipo, quello sarà il numero di disegni che potrò creare con quella piega. Partendo da ogni disegno poi ricomincerò il tipo di valutazione. Se dovessi però avere un altra piega dello stesso tipo la situazione si complicherebbe (risulta difficile dimostrarlo a parole sul forum, mi affido alla vostra immaginazione).

Ad oggi non sono riuscito a scrivere un algoritmo decente che mi dia la soluzione corretta.

Voi avete qualche idea?

wingman87
04-04-2012, 17:03
Potresti scrivere (magari disegnare) quali sono i 5 modi per piegare 4 francobolli?

kevinpirola
04-04-2012, 17:12
http://img812.imageshack.us/img812/8831/quattroo.jpg (http://imageshack.us/photo/my-images/812/quattroo.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

eccoli

wingman87
04-04-2012, 20:40
Ok, un modo per risolvere il problema penso di averlo trovato, anche se è ancora in fase di elaborazione, però mi sembra assai costoso...

L'idea è usare un approccio ricorsivo, e gli elementi fondamentali dell'algoritmo si ridurrebbero a "piegatura" e "confronto".

Per piegatura intendo partire da una piegatura già esistente, come una di quelle che hai disegnato nello scorso post e trovare le piegature risultanti dall'aggiunta di un francobollo in tutti i posti possibili.
Esempio 1:
http://desmond.imageshack.us/Himg594/scaled.php?server=594&filename=es1.png&res=medium
Esempio 2:
http://desmond.imageshack.us/Himg688/scaled.php?server=688&filename=es2d.png&res=medium
Negli esempi la parte nera è la piegatura di partenza e la parte rossa è il francobollo in più. Spero si capisca cosa significa il tratteggio rosso...

Una volta calcolate le nuove piegature arriva la fase del confronto in cui bisogna eliminare le piegature equivalenti: nel primo esempio sono tutte equivalenti, nel secondo le piegature distinte sono solo 2.

Quello che manca è appunto una struttura dati per rappresentare la piegatura e confrontarla con le altre ma ci sto pensando.
Invece per quanto riguarda il calcolo delle nuove piegature si può prendere un capo della piegatura di partenza e poi, prima verso sinistra e poi verso destra, aggiungere il francobollo ove possibile, cioè subito dopo e dove si può scavalcare le pieghe successive. Su quel "dove si può scavalcare le pieghe successive" ci sto ancora pensando però...

Come vedi è una soluzione ancora incompleta ma ho scomposto il problema in due sottoproblemi che credo si possano affrontare più facilmente.

kevinpirola
05-04-2012, 00:52
il mio problema resta solo il confrontare le piegature (definendone quindi una struttura) io so già calcolare quante piegature diverse corrispondono ad ogni combinazione binaria di sensi orari ed antiorari (in quasi tutti i casi, tra poco mostro il caso eccezione)

ad esempio so che a:

101010 corrisponde 1 solo disegno mentre a:
101011 corrispondono 4 disegni secondo la regola per cui la piegatura 1 può entrare dentro ogni "avvallatura" creata dalle altre piegature 1.

101000 ad esempio è un caso che mi crea problemi. scompongo il numero in due parti, le prime 5 piegature, escludendo l'ultima in sequenza.

esse danno luogo a 3 piegature differenti perchè la seconda piegatura 0 può inserirsi in tutte le cavità generate dalle altre piegature 0 oppure piegarsi esternamente.
Se poi vado a controllare la sesta piegatura allora la storia si complica perchè nelle piegature dentro alle cavità sono morte, ovvero si può proseguire in un solo modo nella piegatura, partendo invece dalla piega "esterna" la successiva può andare:
1: senza scavallare nessuna altra piega
2: entrando nelle cavità, questa volta generate dalle pieghe 1, cioè 2 tipi diversi
3: chiudendosi esternamente
in tutto quindi 4 disegni...

questo mi incasina troppo le cose perchè non riesco a calcolare un algoritmo che a partire dal mero numero binario mi calcoli precisamente il numero di disegni corrispondenti alla stessa sequenza di orari ed antiorari..

bisogna trovare un metodo "grafico" in cui si possa disegnare ogni oggetto in modo diverso e che quindi si possa anche confrontare tra loro se ce ne sono di uguali..


Un bel casino insomma

wingman87
05-04-2012, 09:32
Ho giusto pensato ieri sera un modo per rappresentare i francobolli piegati, ma non ho avuto tempo di controllare meglio se funziona...
Prendi i francobolli non piegati ed assegni un numero ad ogni francobollo: 1,2,3,4,...
Dopodiché rappresenti la piegatura scrivendo da sinistra a destra il francobollo che incontri nella piegatura.
http://img812.imageshack.us/img812/8831/quattroo.jpg
Ad esempio la prima piegatura dell'immagine si può rappresentare come:
1-3-4-2
C'è da dire però che ci sono 4 modi diversi per rappresentare la stessa piegatura, infatti leggendola da destra a sinistra diventa:
2-4-3-1
E assegnando i numeri ai francobolli partendo dall'altro estremo può essere letto come:
3-1-2-4
o
4-2-1-3
Ho pensato però che si potrebbero prendere tutte le 4 rappresentazioni e poi usare quella con l'ordine alfabetico più basso:
1-3-4-2
2-4-3-1
3-1-2-4
4-2-1-3

Cosa ne pensi? Non sono sicuro che piegature diverse portino alla stessa rappresentazione ma credo di no. Bisognerebbe rifletterci un po' su...

kevinpirola
05-04-2012, 11:17
ti dirò ieri sera ero arrivato ad un pensiero simile, però come l'hai detto tu è tropo semplificatoogni sequnza di francobolli infatti se chiamata con il numero può essere di qualsiasi tipo perché ogni fb si può collegare sia nella parte superiore sia in quella inferiore con il suo vicino, inoltre ci sono combinazioni impossibili tenendo conto del punto di contatto del successivo e del precedente. inoltre i fbi marginali hanno solo precedente e/o successivo.

io perciò sto lavorando sempre con il discorso di comb binaria (metodo rude per definire un gruppo di piegature e poi ad una rappresentazione dell' oggetto francobollo ad esempio si può pensare un qualcosa di grafico semplificato così da poter poi semplicemente sovrapporre i disegni..

wingman87
05-04-2012, 11:59
ti dirò ieri sera ero arrivato ad un pensiero simile, però come l'hai detto tu è tropo semplificatoogni sequnza di francobolli infatti se chiamata con il numero può essere di qualsiasi tipo perché ogni fb si può collegare sia nella parte superiore sia in quella inferiore con il suo vicino,
Ci avevo pensato ma alla fine ho concluso che era un non problema perché una volta che hai deciso dov'è la prima attaccatura le altre sono vincolate, quindi in realtà ci sono solo due interpretazioni della stessa sequenza di numeri. E queste due interpretazioni mi sembrano equivalenti.
inoltre ci sono combinazioni impossibili tenendo conto del punto di contatto del successivo e del precedente. inoltre i fbi marginali hanno solo precedente e/o successivo.
Questo non l'ho capito... voglio dire... la rappresentazione è una cosa, il fatto che una sequenza sia possibile o meno è un'altra.

kevinpirola
05-04-2012, 15:47
immagina la sequenza 1-6-3-7-4-2-5 partendo da 1 in su collego prima due poi 3 poi 4 e a quel punto non non puoi più continuare

wingman87
05-04-2012, 15:48
Sì, ma quella è una sequenza non valida, anche se parti collegando 1 e 2 da sotto

kevinpirola
05-04-2012, 16:51
appunto, per quello dicevo che ci sono sequenze non valide, come fai a calcolare quelle valide?

wingman87
05-04-2012, 19:39
Veramente io pensavo di generare solo sequenze valide (ancora non so come ma mi sembrava che tu ci stessi già lavorando). Per fare un esempio, io pensavo di fare così:

Passo base:
ho un francobollo, la rappresentazione delle "piegature" di un francobollo è il set { "1" } (in realtà non è una vera piegatura perché non ci sono pieghe ma vabbé)

Prima iterazione:
Calcolo le piegature valide di due francobolli partendo dal set base ed elimino i doppioni (i doppioni dovrebbero avere la stessa rappresentazione secondo il metodo che ho proposto):
{ "1-2" }

Seconda iterazione:
Calcolo le piegature valide di 3 francobolli partendo dal set ottenuto nell'iterazione precedente ed elimino i doppioni:
{ "1-2-3", "1-3-2" }

E via così...

Probabilmente non mi sono spiegato molto bene ma al momento ho il cervello un po' in tilt... sorry