Considérez le problème suivant:
Soit une roue définie comme une liste indexée liée de façon circulaire de entiers. Par exemple…
{3, 4, 9, -1, 6}
… Est une 5 roues avec 3 en position 0, 4 en position 1, etc. Une roue prend en charge l'opération de rotation, de sorte qu'une rotation en une étape transformerait la roue ci-dessus en…
{6, 3, 4, 9, -1}
… Maintenant avec 6 en position 0, 3 en position 1, etc. Soit un ensemble ordonné de roues distinctes . Étant donné certains et certains entiers , trouvez une série de rotations telles que…
En d'autres termes, si vous disposiez les roues sous forme de matrice, la somme de chaque colonne serait . Supposons que est construit de telle sorte que la solution soit unique jusqu'aux rotations de chaque élément (c'est-à-dire qu'il existe exactement solutions uniques qui consistent à prendre une solution, puis à faire tourner chaque roue en du même nombre d'étapes).
La solution triviale à ce problème consiste simplement à vérifier chaque rotation possible. Voici un pseudocode pour cela:
function solve(wheels, index)
if wheels are solved:
return true
if index >= wheels.num_wheels:
return false
for each position 1..k:
if solve(index + 1) is true:
return true
else:
rotate wheels[index] by 1
solve(wheels, 0)
C'est une solution assez lente (quelque chose comme ). Je me demande s'il est possible de faire ce problème plus rapidement, et aussi s'il y a un nom pour cela.