Ho una matrice (con 0 e 1), che rappresenta un muro del castello e i suoi dintorni.Posizionare gli arcieri sulla parete
Il mio compito è di posizionare gli arcieri sulla parete in modo che coprano quanto più è possibile. Ci sono due regole:
: Ogni arciere ha gamma 1 - che significa, si può sparare solo su tessere adiacenti (ogni tessera ha 8-vicini di casa), che non sono a parete (fuoco amico è vietato in questo esercito!).
: Se accade, che più arcieri possono sparare alla stessa tessera, quella tessera conta come una sola.
Sto lottando per trovare una soluzione efficace per questo, in parte perché non lo so, se esiste in tempo polinomiale. C'è qualche?
Credo che il primo passo sia l'uso dell'algoritmo BFS per valutare ogni piastrella sulla matrice, ma non so come risolverlo con la seconda regola. La soluzione della forza bruta è abbastanza semplice: valuta tutte le posizioni e poi provale tutte, il che sarebbe molto poco efficace - penso che O (| possibili posizionamenti |^n), che non è bello.
semplice esempio:
Le piastrelle di colore grigio rappresenta la parete. I numeri all'interno di una tessera rappresentano la copertura dell'arciere piazzato su quella tessera. Giusto per essere sicuro, ho aggiunto quelli arancioni, che rappresentano la copertura dell'arciere in piedi sulla tessera b2. E l'ultima informazione - la soluzione corretta per questo è b2 e b6, con copertura di 14. Non può essere b2 e b4, perché copre solo 11 tessere.
Avete un caso di test campione? Le piastrelle adiacenti sono nel quartiere 4 o nel quartiere 8? –
Puoi facilmente esprimere il problema come un ILP, che ti darà un modo efficace per trovare una soluzione in termini pratici. Ma non garantisce il tempo polinomiale. –
@JohnBupit Le piastrelle adiacenti sono 8 quartieri. Trarrò un semplice caso di test e lo posterò qui. – tomascapek