Domanda

Ehi gente che ho questa struttura per l'albero di ricerca

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];
    }
.

Questa è la definizione del nodo root

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

Dopo la fine della ricorsione nella funzione Valore MAX, l'array in rootnode non deve essere modificato dal suo primo stato ma quando la visualizzato ottengo un array riempito con cose che significa che il rootnode.state è passato per riferimento aLa funzione del valore massimo :(

// Sto cercando di implementare algoritmo minimax.

È stato utile?

Soluzione

Se non si desidera che gli oggetti siano passati come parametri da modificare, passare in una copia (o creare una copia del parametro all'interno del metodo).

Nota che char[][] significa che hai una serie di array di caratteri, I.e. Stai lavorando con gli oggetti e se si copia il primo livello che potresti ancora avere un riferimento al secondo.

Così potresti doverlo loop attraverso il primo livello / dimensione e copiare tutti gli array in là, come questo:

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

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

Altri suggerimenti

Se è necessario, è possibile creare facilmente una copia dell'array attraverso Arrays.copyOf

Puoi anche creare una copia profonda.Come fare questo è stato risposto qui: Come copiare profondo un 2D irregolareArray

Sì, Java passa referenze agli array e non all'array come valore.Quindi, se fai un riferimento al tuo stato interno lontano, il ricevitore può cambiarlo e il cambiamento è "visibile" nella sorgente (infatti: è solo uno array che è stato modificato e tutti i titolari di riferimentovedrà il cambiamento).

Quick Fix / Soluzione: clona il tuo array di stato e passare un riferimento a questo clone invece dell'originale.Questo manterrà il tuo stato di radice interno non modificato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top