Détection d'une séquence de nœuds dans une grille

12

Étant donné l'image ci-dessous, je dois détecter la séquence la plus optimale sur la carte (la ligne verte). Les lignes bleues / rouges représentent les mouvements possibles, mais pas les meilleurs.

Voici les règles:

  1. Vous pouvez déplacer vers n'importe quelle tuile qui est la même et qui est votre voisine (la diagonale est valide)
  2. Une fois que vous avez visité une tuile, vous ne pouvez plus la visiter.

J'ai pensé à parcourir chaque nœud, à regarder ses voisins, puis à passer récursivement. Une fois que je trouve un mouvement possible, je peux le mettre dans une structure. Une fois que tous les mouvements possibles sont trouvés, je choisis simplement le mouvement avec le plus grand nombre de nœuds. Cela devient plus difficile lorsqu'un nœud a plus d'un voisin qui correspond.

Alors, existe-t-il un algorithme que je peux utiliser? Je pensais à une sorte d'inondation, mais cela ne répond pas aux règles n ° 2.

Comme demandé, voici une vidéo de gameplay similaire. http://youtube.com/watch?v=eumnCTG0AE8

entrez la description de l'image ici


la source
Il peut être important de noter que les 3 épées / or sont des correspondances possibles, mais je ne les ai tout simplement pas incluses dans l'image.
Pourquoi les 3 épées / or sont-elles des correspondances possibles? Voulez-vous trouver tous les chemins qui se composent d'au moins 3 éléments?
bummzack
oui, c'est l'idée.

Réponses:

6

Vous pouvez considérer chaque groupe de symboles identiques liés (et par lié, je veux dire que vous pouvez voyager d'un symbole à un autre) un graphique distinct . Pour chacun de ces graphiques, appliquez une recherche de profondeur en premier (DFS) à partir de chaque nœud du graphique qui ne fait pas déjà partie du chemin le plus long pour ce graphique . Chaque fois que vous atteignez une impasse lors de l'application d'un DFS, vérifiez si le chemin que vous venez de parcourir est plus long que le maximum global que vous avez trouvé jusqu'à présent. Si tel est le cas, stockez-le en tant que nouveau chemin le plus long.

Vous remarquerez que dans le paragraphe précédent, j'ai mentionné l'application d'un DFS plusieurs fois pour chaque graphique. Un seul DFS exécuté sur un graphique ne serait pas suffisant. Considérez ce cas particulier:

    1
1 1 1
    1
    1
    1
    1

Si, par hasard, vous exécutez d'abord un DFS sur ce graphique dans le nœud le plus haut, vous découvrirez que le chemin le plus long possible est la ligne verticale, mais ce ne serait pas correct. Cela se produirait chaque fois que vous démarrez l'algorithme DFS dans un nœud qui se trouve quelque part dans le chemin résultant ou n'en fait pas partie du tout. Dans cet exemple particulier, vous devez également démarrer un algorithme DFS à partir du nœud le plus à gauche de la deuxième ligne. Cela trouvera le chemin correct. De manière générale, vous devrez exécuter des algorithmes DFS dans chaque nœud qui ne fait pas actuellement partie du chemin le plus long pour ce graphique, comme indiqué ci-dessus.

Le pire scénario absolu pour cet algorithme serait un tableau rempli ou principalement rempli d'un seul type de symbole, mais cela ne se produira probablement pas dans le jeu. Faites également attention à la façon dont vous stockez les chemins les plus longs pour chaque graphique. Si vous n'optimisez pas ce bit, il vaut peut-être mieux appeler un DFS pour chaque nœud de la scène. En supposant que vous ne travaillez pas avec de très grandes cartes et que la vitesse n'est pas un gros problème, cette solution devrait être assez rapide.

Techniquement parlant, en décomposant votre carte en graphiques séparés, vous vous retrouvez avec plusieurs « problèmes de chemin le plus long ». Comme nous pouvons le voir dans votre exemple, vous pouvez avoir des cycles dans votre graphique (par exemple, avoir tous les symboles à l'extérieur de la scène du même type), ce qui signifie que dans ce problème particulier, vous devez trouver le chemin le plus long dans plusieurs graphiques cycliques non orientés, ce qui ne peut pas être fait en temps polynomial .

Si vous trouvez que c'est trop lent, consultez cette réponse sur StackOverflow pour plus de détails sur la façon d'optimiser les "problèmes de chemin le plus long" individuels.

TokPhobia
la source