Pregunta

Hola, tengo esta estructura para el árbol de búsqueda

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

esta es la definición del nodo raíz

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

después del final de la recursividad en la función de valor máximo, la matriz en rootNode no debe editarse ya que es el primer estado, pero cuando la muestro obtengo una matriz llena de cosas, lo que significa que rootNode.state pasó por referencia ala función de valor máximo :(

// Estoy intentando implementar el algoritmo MiniMax.

¿Fue útil?

Solución

Si no desea que se modifiquen los objetos que se pasan como parámetros, pase una copia (o haga una copia del parámetro dentro del método).

Tenga en cuenta que char[][] significa que tiene una matriz de matrices de caracteres, es decir, está trabajando con objetos y, si copia el primer nivel, es posible que todavía tenga una referencia al segundo.

Por lo tanto, es posible que tenga que recorrer el primer nivel / dimensión y copiar todas las matrices allí, así:

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

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

Otros consejos

Si lo necesita, puede crear fácilmente una copia de la matriz a través de Arrays.copyOf

También puede crear una copia profunda.Aquí se ha respondido cómo hacer esto: Cómo copiar en profundidad un 2D irregularmatriz

Sí, Java pasa las referencias a las matrices y no la matriz como un valor.Entonces, si le da una referencia a su estado interno, el receptor puede cambiarlo y el cambio es "visible" en la fuente (de hecho: es solo una matriz solo una que se ha cambiado y todos los titulares de referenciaverá el cambio).

Solución / solución rápida: clonar su matriz de estado y pase una referencia a este clon en lugar del original.Esto mantendrá su estado de raíz interna sin modificar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top