Algoritmo per risolvere questo puzzle "treefarm"

2

Come andrei a scrivere un programma per risolvere questo tipo di puzzle: I quadrati verdi rappresentano gli alberi e devi piantarli in modo tale che:

  • Gli alberi non si toccano affatto (nemmeno in diagonale)
  • Ogni riga e colonna contengono un numero specifico di alberi, che viene indicato nella cella corrispondente a destra o sotto la griglia principale, rispettivamente

I numeri all'interno delle celle della griglia principale sono irrilevanti.

Posso eliminare immediatamente righe e colonne con una quantità di alberi necessaria di 1 che ha un albero in loro, e 9x9 quadrati attorno a ciascuno degli alberi. Dopo di ciò, mi sono bloccato.

Grazie per qualsiasi idea.

    
posta sammko 09.07.2015 - 13:31
fonte

2 risposte

1

Quando risolvi un enigma come questo, ci sono due cose che puoi fare:

  1. Cerca i luoghi in cui puoi applicare alcuni schemi per tagliare un quadrato o piantare un albero con certezza
  2. Prova a indovinare e procedi finché non arriva a una situazione irrisolvibile (nel qual caso torni indietro alla tua ipotesi precedente), o hai finito.

Per questo particolare puzzle, le operazioni che rientrano nella prima categoria che posso vedere sarebbero:

  • Contrassegna tutte le celle in righe o colonne contenenti un numero uguale di alberi al numero richiesto (incluso 0).
  • Contrassegna tutte le celle adiacenti ad un albero piantato
  • In qualsiasi riga o colonna con una sola cella rimanente e un altro albero richiesto, pianta un albero in quella cella
  • In qualsiasi riga o colonna con due celle rimanenti e altri due alberi richiesti, pianta un albero in entrambe le celle
  • In qualsiasi riga o colonna con tre celle rimanenti tutte collegate e altri due alberi richiesti, pianta un albero nelle celle alle estremità del gruppo di tre.
  • In qualsiasi riga o colonna con tre celle rimanenti in cui due sono connesse e altri due alberi richiesti, pianta un albero nella cella disconnessa.

Tutti questi elementi devono essere controllati per ogni riga, colonna e albero al primo avvio. Dopo di ciò, i primi due possono essere eseguiti immediatamente quando si pianta un albero.

Se sono consentiti numeri di righe e colonne superiori a 2, dovrai calcolare una versione più generale delle 4 regole finali. In alternativa, una semplice forza bruta che controlla tutte le combinazioni valide per vedere se qualcuno di loro ha sempre una struttura o non ha mai un albero funzionerebbe.

Per la seconda categoria, eseguirai una ricerca ad albero in profondità. Per ogni nodo, ti consigliamo di effettuare le seguenti operazioni:

  1. Se questo è un nodo foglia, controlla se è terminale (il gioco è impossibile da vincere o vinto). Se è così, o hai finito o hai bisogno di tornare indietro al genitore
  2. Se questo è un nodo foglia, applica le identità sopra per vedere se puoi immediatamente segnare o piantare alberi in altre tessere.
  3. Se questo è un nodo foglia, aggiungi i bambini corrispondenti ad alcune tessere non riempite che non sono marcate.
  4. Scegli un bambino che non è già stato completamente espanso ed espandi.

Un metodo ingenuo per 3. e 4. sarebbe quello di aggiungere tutti i bambini non marcati, quindi selezionarne uno a caso (o in un ordine arbitrario) per espandere. Ma puoi quasi certamente fare meglio con un euristico.

Uno che viene subito in mente è per il terzo passo, selezionare la riga o la colonna con le combinazioni minime possibili di posizionamenti di alberi che la soddisfino in modo isolato. Ad esempio, la quinta riga dall'alto ha cinque combinazioni possibili che lo soddisfano. Quindi aggiungi solo un bambino per ognuna di queste combinazioni. Sai che uno di loro sarà sicuramente corretto, quindi ora hai solo 5 figli da espandere, uno dei quali sicuramente otterrà la risposta giusta.

    
risposta data 09.07.2015 - 14:28
fonte
-1

Sembra una variante del puzzle nonogram . Puoi trovare ispirazione dagli esistenti solutori di nonogrammi . Sembra che tu debba aggiungere un vincolo alle caselle che non toccano in diagonale.

    
risposta data 09.07.2015 - 14:30
fonte

Leggi altre domande sui tag