Une pensée au hasard a sauté dans ma tête (quand je partageais une barre de chocolat bien sûr!). Je me demandais s'il y avait un algorithme générique pour résoudre ce problème.Algorithme pour diviser une barre de chocolat à parts égales
Le problème va comme ceci:
Infos
1. Vous avez une barre de chocolat avec de petits carrés disposés dans une matrice rectangulaire
2. Il y a n personnes dans la salle
Le problème
Écrire un algorithme qui génère la configuration optimale (pxq) où la barre peut être partagée également entre n, n-1, n-2...., 2, 1
personnes soumises aux restrictions suivantes:
1. Un petit carré (le carré de l'unité) ne peut pas être coupé en plus petits morceaux
2. Toutes les ruptures doivent être faites complètement le long d'un axe
3. Le nombre total de ruptures ne peut pas être plus que n (c'est pour décourager les solutions inefficaces comme essayer de diviser la barre entière en petits morceaux et diviser les petits morceaux)
4. p ou q ne peut pas être égal à 1. yx a souligné dans l'une des réponses que le problème est facilement soluble si un côté a 1 barre. Ceci est cependant pas une bonne solution pour des situations réelles - ce qui était l'intention de résoudre ce problème :)
Exemple
Pour n = 4, la configuration optimale est de 4 x 3.
~~~~ ~~~~ ~~~~ ~~~~
| | | | |
~~~~ ~~~~ ~~~~ ~~~~
| | | | |
~~~~ ~~~~ ~~~~ ~~~~
| | | | |
~~~~ ~~~~ ~~~~ ~~~~
Cette configuration peut être répartie entre:
4 personnes en 3 pauses le long des axes verticaux
3 personnes avec 2 pauses le long des axes horizontaux
2 personnes 1 pause juste au milieu
d'autres solutions empiriques sont (n, p, q) = (1, 1, 1); (2, 2, 1); (3, 3, 2); (4, 4, 3); (5, 5, 12); (6, 6, 10) OR (6, 5, 12)
Clarifications
Une rupture est définie comme une coupe le long d'un axe pour le sous-ensemble de la barre, le cas échéant. Pour mieux illustrer cela, que vous avez un 2 x 2 barre de chocolat comme ceci:
~~~~ ~~~~
| | |
~~~~ ~~~~
| | |
~~~~ ~~~~
La sagesse conventionnelle indique que vous devez faire 2 pauses (les axes perpendiculaires au milieu - vers le bas et à travers) pour diviser cette barre en 4 pièces. Cependant, dans le monde réel (s'il s'agissait d'une barre de chocolat), vous devez d'abord la casser en deux puis la casser à nouveau séparément. Cela fait un total de 3 pauses - 1 pause sur la barre entière et 2 pauses sur 2 sous-ensembles différents de la barre.
Je ne pouvais pas trouver de solution n'importe où sur Internet - si quelqu'un pense que ce n'est pas une question de programmation ou une solution existe déjà, n'hésitez pas à fermer la question =)
vos règles sont trop restrictives, afin de casser quelque chose en n parties, vous aurez besoin d'un minimum de n- 1 pauses, mais puisque les pauses doivent être le long d'un bord et ne peuvent pas deviner un petit morceau en deux aussi vous ne pouvez pas faire une pause composée (dans votre section clarifications), ce que vous demandez est impossible. –
@yx Le problème consiste à casser la barre avec un maximum de n ruptures. Je ne pense pas que vous ayez besoin de faire des pauses composées pour atteindre la restriction - j'ai une solution pour jusqu'à n = 8 (fait à la main bien sûr). – roy100
Donc, la solution doit seulement sortir p et q et non pas où les casser? – Unknown