2013-02-06 22 views
8

Ho cercato di trovare un algoritmo ottimale per un problema ispirato alla "città tripla" del gioco. Il gioco va così:Algoritmo ottimale di tripla città

Si posizionano gli oggetti in una griglia e, ogni volta che si crea un set di tre, si condensano in un oggetto di livello superiore nella posizione dell'ultimo oggetto posizionato.


basic transformation


Inoltre, se si inserisce tre di questi oggetti b insieme di nuovo comprimono per formare un oggetto livello ancora più alto.


setting up for c


transformation to c


Nota: in questi diagrammi livello di un oggetto è espressa come i, b i, ec i e il pedice indica gli oggetti intorpiditi er nel set di tre.

Per semplificare le cose, sto solo considerando quando ogni oggetto che devi posizionare è del livello più basso.

Ora le mie domande sono:

1: Esiste un algoritmo per determinare la quantità minima di zona della griglia necessaria per rendere un oggetto di livello x, x data?

Ad esempio, per il livello a è necessario 1 x 1, per il livello b è necessario 1 x 3, per il livello c è necessario 1 x 5.

2: Date le dimensioni di una griglia, possiamo trovare il livello più alto e il numero di oggetti realizzabili?

Ad esempio, per un 2x2 è possibile ottenere 2 'Livello A e di livello 2' di b

3: Esiste un algoritmo per trovare l'ordine ottimale e la posizione degli oggetti per ottenere il più alto livello possibile, data una griglia fissa?

Ad esempio, per un 2x2 è possibile ottenere (1,1), (1,2), (2,2)

4: Data una posizione di un oggetto di livello x previsto, quale set di mosse ridurre al minimo la quantità di spazio necessario per realizzare questo oggetto?

5: Quali sono le complessità ottimali di questi algoritmi?

Aggiornamento:

Una cosa che penso è di primo piano nella ricerca di soluzioni è che il ottenere un articolo di livello x non può essere fatto in qualsiasi luogo arbitrario.

Ad esempio: [ _ _ _ _ c] è impossibile da ottenere in una griglia fissa 1 per 5 perché è necessario l'ultimo b in quinta posizione e quindi l'ultimo a in quinta posizione. Quindi per posizionare il primo b: [a _ _ _ _]->[a a _ _ _]->[_ _ b _ _] o [_ a _ _ _]->[_ a a _ _]->[_ _ _ b _]. In entrambi i casi non c'è abbastanza spazio per posizionare 3 'a per fare l'ultima b del c.

Un'altra cosa, non possiamo presumere che qualsiasi cosa possa essere srotolata su una griglia 1 dimensionale. Questo diventa chiaro con il mio prossimo punto.

qualcosa di interessante che ho trovato:

C'è una vicinanza minima per il confine che un oggetto di livello C può essere in una griglia tridimensionale 1. [_ _ a a a]->[_ _ _ b]->[_ a a a b]->[_ _ _ b b]->[a a a b b]->[_ _ c _ _]. Quindi un oggetto di livello c in una griglia (ottimale) da 1 a 5 può essere fatto solo nella 3a posizione.

Ne consegue che questo è il livello più alto che può essere eseguito in 1 da qualsiasi griglia numerica. Prendete un 1 per griglia infinito:

..._ a a a _ ... -> ... _ a a a b _ ... -> ... _ a a a b b _ ... -> ... _ c _ ...

ora cerchiamo di ottenere un altro c direttamente accanto ad essa:

..._ c a a a _ ... = ... _ c b _ ... or ... _ c _ b _ ... or ... _ c _ _ b _ ...

L'unica opzione è ..._ c b _ ... perché gli altri rendono impossibile per formare un altro b tra c eb. La nostra unica opzione impedisce il nostro unico modo di creare c direttamente accanto al nostro primo c perché blocca l'ultimo c di andare lì. Pertanto, in una dimensione, c è il livello più alto che possiamo fare. In altre parole, il problema deve essere considerato in 2 dimensioni.

+2

Questa è una domanda e mezza. :) – biziclop

+0

Hai risultati intermedi? –

+0

Solo quelli che riuscivo a capire nella mia testa per i valori di bassa griglia. Sto ancora pensando al modo migliore per affrontarlo. – Raufio

risposta

2

EDIT: Il seguente è in realtà falso, ed ecco perché: fai quello che descrive per ottenere una "c", ecco come va: _ _ aaa -> _ _ _ _ b -> (..) _ _ _ bb -> _ _ bbb -> _ _ c _ _

Quindi la "c" è ora nel mezzo della linea e il prepending non funziona in questo modo. Lascio qui, quindi se qualcuno lo legge, almeno c'è una spiegazione del perché è falso. Forse questo ti farà risparmiare tempo pensando allo stesso errore.


[FALSE DA QUI] 1: si può sempre farlo in 3 + 2 * (x-1) Dal momento che solo "anteporre" gli elementi necessari e per ogni "livello" della lettera. Prova per induzione:

per ottenere una "b", hai bisogno di 3 + 2 * (1-1) = 3 spazi.

Se riesci a ottenere il livello x negli spazi 3 + 2 * (x-1), il livello x + 1 ti porta 3 + 2 * (x-1) spazi per costruire un personaggio di livello x e 2 spazi di archiviazione, che ti costano 3 + 2 * (x-1) +2 = 3 + 2 * ((x + 1) -1) spazi.

Quindi, ecco, puoi effettivamente ottenere una "c" in un rettangolo di 1 altezza e 5 larghezza. Puoi ottenere una "f" usando 13 spazi, e così via.


pensare a che cosa questo suggerisce: se si desidera comprimere la tua lettera in una piccola area, trova una piccola area che contiene 3 + * (x-1) spazi 2 e ruotare la prepending quando necessario. Ciò significa che puoi sempre andare verso l'esterno dalla posizione in cui vuoi finire in spirali. Ecco però la svolta: è possibile che la tua ultima pietra di ogni livello provenga da direzioni alternate in modo da non allontanarti da dove hai iniziato. La complessità di passare effettivamente attraverso tutti i passaggi è O (3^x) poiché sono necessarie 3 lettere del livello precedente per il prossimo, ed è tutto moltiplicativo.

Problemi correlati