Posté par
kjus kjus
Bonjour,
Désolé de répondre un peu tard, mais voici pour ceux que ça intéressent un algorithme permettant de trouver la meilleure solution (ici de total 63) de manière sûre.
Un algorithme naïf, qui fonctionne, mais dont l'espace de recherche est beaucoup trop gros, serait d'énumérer tous les placements possibles des immeubles, et de ne garder que le (ou les) placements optimaux. Une manière de tester récursivement, ligne par ligne, toutes les possibilités de placements d'immeubles. Il faudrait bien sûr mémoriser assez d'information des lignes précédentes pour satisfaire les contraintes liées aux batiments de la ligne i-1 lorsque l'on teste tous les placements de batiments de la ligne i.
Une remarque pour ces contraintes : pour remplir la ligne i en satisfaisant les contraintes liées aux batiments de la ligne i-1, il suffit de connaitre la ligne i-1 et la ligne i-2. Mieux, on peut remarquer que chaque batiment de la ligne i-1 est soit "satisfait" (il y a déjà assez de batiments autour de lui avec la bonne taille), soit impose un numéro précis de batimenent sur sa colonne en ligne i. Il suffit donc de stocker la ligne i, et les contraintes liées aux batiments non satisfaits de la ligne i.
Ensuite, pour pouvoir calculer ça vite, on s'aperçoit qu'étant donné un état de ligne i, et un ensemble de contraintes, on peut optimiser le score des lignes suivantes (supérieures à i) indépendemment. (C'est l'idée de la programmation dynamique, cf http://en.wikipedia.org/wiki/Dynamic_programming).
Le nombre d'états possibles est d'environ 5 * 5^5 * 5^5 (nombre de lignes * états ligne i * contraintes), et le nombre d'états de lignes suivantes à tester est en moyenne contant (pour simplifier). L'algorithme va donc effectuer en gros 50 million de tests (il y a en gros cent opérations par test, il tourne en moins d'une seconde en pratique).
Vous pouvez voir le code ici (pour gcc):
http://pastebin.com/f9aa2145
Enfin, merci pour l'enigme qui était très sympatique
