Question

Hé les gens j'ai cette structure pour l'arbre de recherche

class State
{
    //CLASS STATE
    int value;
    char[][] state; //the game Grid 
    State child[]; // children of current state, maximum is 8
    State(char[][] src)
    {
        state=src;
        child=new State[8];
    }

Ceci est la définition du nœud racine

 State rootNode = new State(currentGrid);
 rootNode.value=-1;
 int v =maxValue(rootNode,depth);

Après la fin de la récursivité dans la fonction de valeur maximale, le tableau dans rootNode ne doit pas être modifié car c'est le premier état mais lorsque je l'affiche, je reçois un tableau rempli de choses qui signifie que rootNode.state est passé par référence à la valeur maximale fonction :(

// J'essaie d'implémenter l'algorithme minimax.

Était-ce utile?

La solution

Si vous ne voulez pas d'objets qui sont passés en tant que paramètres à modifier, passez dans une copie (ou faites une copie du paramètre à l'intérieur de la méthode).

Notez que char[][] signifie que vous avez un tableau de tableaux de char, c'est-à-dire que vous travaillez avec des objets et si vous copiez le premier niveau, vous pourriez toujours avoir une référence à la seconde.

Ainsi, vous devrez peut-être parcourir le premier niveau / dimension et y copier tous les tableaux, comme ceci:

char target[][] = new char[state.length][0];

for( int i = 0; i < state.length; ++i ) { 
  target[i] = Arrays.copyOf(state[i], state[i].length);
}

Autres conseils

Si vous en avez besoin, vous pouvez facilement créer une copie du tableau via Arrays.copyOf

Vous pouvez également créer une copie profonde. Comment faire cela a été répondu ici: Comment copier en profondeur un tableau 2D irrégulier

Oui, Java passe des références aux tableaux et non au tableau comme valeur. Donc, si vous faites référence à votre état interne, le récepteur peut le changer et le changement est "visible" dans la source (en fait: c'est seulement une Array qui a été modifié et tous les détenteurs de référence verront le changement).

Correction rapide / solution: clonez votre tableau d'état et transmettez une référence à ce clone au lieu de l'original. Cela gardera votre état racine interne non modifié.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top