J'essaie d'en apprendre davantage sur la conception d'algorithmes et je me suis mis au défi de créer un jeu simple qui présente des utilisateurs avec une gamme de chiffres, un numéro cible et une gamme d'opérateurs (plus, moins, Multiplier, diviser, peut-être une racine carrée et telle la plus tard). Ce que je dois faire, c'est décider s'il est possible de faire ou non ce numéro cible à l'aide des numéros disponibles dans le tableau. P>
Je suis un peu soulevé sur où commencer avec ça. Dans différentes tours du jeu, différents opérateurs peuvent être disponibles, tels que Ai-je raison de dire que je aurais effectivement besoin d'un algorithme séparé pour chaque combinaison d'opérateurs (mais beaucoup y sont, 20 ou autre)? Et si oui, aurai-je alors besoin de itérer chaque numéro dans la grille, effectuant chaque opérateur disponible de l'autre dans le tableau? Cela semble trop sale, mais je ne suis pas vraiment sûr quelles autres options il y a. Cette option ne suit pas non plus aucun chemin spécifique via plusieurs opérations (par exemple si je voulais faire Quelqu'un pourrait-il me donner quelques indications sur où commencer avec ce genre de problème? P> +, -, * et / code>, + et - code>, uniquement + et * << / code> ou tout sauf + code>, etc. p>
7 code>, je peux faire 12 + 5 - 10 code> si ceux-ci étaient les seuls Numéros disponibles pour moi dans le tableau). P>
3 Réponses :
énumérer toutes les expressions possibles. Pour les nombres 1,2,3 et l'opérateur + et -, vous pouvez obtenir: 1 + 2 + 3,1 + 2-3,1-2 + 3,1-2-3. P> Li>
Évaluez toutes les expressions possibles. p> li> ol>
2 + 3-1 est manquant. Je veux dire, pas seulement les autorisations de l'opérateur, doivent également envisager des possibilités de commandes numériques.
@ bjskishore123 alors considérez simplement la permutation des chiffres. Vous pouvez utiliser une méthode heuristique pour élaguer la recherche.
@Sayakiss énumérant les expressions est la partie que j'ai des problèmes et pourquoi j'ai vraiment posé la question en premier lieu. Me dire de simplement "le faire" n'est pas très utile. Pourriez-vous expliquer à peu près comment je pourrais faire la création d'une liste de toutes les expressions possibles, en particulier car elles peuvent être de longueurs variables?
@Lukech Comment générez-vous une permutation? Si vous pouvez le faire, c'est l'idée similaire à ce problème. Si vous ne pouvez pas, recherchez-la dans Google et vous obtiendrez des informations massives à ce sujet.
@Sayakisss Je ne suis pas sûr de ce que vous entendez en générant une permutation.
Vous êtes confronté à un problème plus généralisé du Problème de partition , qui est np-complete . P>
Le problème de la partition est le suivant: donné De cela, nous pouvons conclure votre problème est NP-Hard aussi, et Les alternatives sont: p>
Désolé si c'est une mauvaise nouvelle - mais au moins, vous ne recherchez pas quelque chose qui (la plupart des informaticiens croient) n'est pas là p> n code>, divisez-les en deux groupes (distincts) A code> et B code> tel que somme (A) = somme (b) code>. Maintenant, il est facile de voir que si vous avez un problème avec +, - les opérateurs et le numéro cible 0 - il s'agit fondamentalement du même problème, et il existe une réduction immentime du problème de la partition à votre problème. P>
quelque chose qui n'est pas là i> ... pourtant :-)
@ Ring0 Je suppose que je ferais mieux d'aller le créer alors, si ce n'est pas encore là. C'est pourquoi j'apprends ce genre de choses, je suppose. :)
@Lukech C'est le P vs NP Problème , qui est toujours ouvert (et a obtenu 1 000 000 $ Bounty dessus). La création d'un tel algorithme (en temps polynomial) prouvera p = np. La plupart des chercheurs croient cependant que p! = NP, donc si tel est le cas - cet algorithme n'existe pas.
Vous voudrez peut-être commencer par lire des références au problème "Quatre Fours" (par exemple, en.wikipedia.org/wiki / Four_fours ) ou "Comptedown" Problèmes (par exemple, EprintS.Nottingham. AC.UK/226/1/Countdown.pdf )
Peut-être que mon commentaire sera hors du sujet, mais je crois que vous cherchez le problème de la mauvaise perspective. Dans votre code, vous avez déjà le numéro cible. Ce que vous devrez faire est de créer une fonction qui génère les opérateurs de niveau et le tableau des numéros d'entrée. Quitter le défi aux joueurs. À moins que l'un des joueurs est l'AI de votre jeu.
Voir Stackoverflow.com/Questtions/15293232/...
@ALEXFILIPOVICI Alors vous suggérez que lorsque je générerai le tableau, je génère définitivement au moins une solution correcte à ce moment-là? Si tel est le cas, comment puis-je arrêter l'utilisateur, par exemple, en utilisant l'un des numéros nécessaires de manière incorrecte et entrant ainsi dans une situation sans giction de cette manière?
Peut-être devriez-vous envisager de limiter également le nombre d'utilisateurs de l'opérateur.
Est-ce obligatoire d'utiliser chaque numéro au moins une fois?
@ BJSKISHORE123 Pas du tout, je pense qu'il y aurait un tableau de 50 ou deux numéros, et une fois que l'on utilise une fois, il ne peut plus être utilisé.