質問

皆さん、私は検索ツリーにこの構造を持っています

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

これはルートノードの定義です

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

最大値関数での再帰の終了後、rootNode の配列は最初の状態であるため編集すべきではありませんが、表示すると、要素で満たされた配列が表示されます。これは、rootNode.state が最大値への参照によって渡されたことを意味します。関数 :(

// MiniMax アルゴリズムを実装しようとしています。

役に立ちましたか?

解決

パラメータとして渡されるオブジェクトを変更したくない場合は、コピーを渡します(またはメソッド内でパラメータのコピーを作成します)。

char[][]は、char配列の配列があることを意味します。つまり、オブジェクトを操作していて、最初のレベルをコピーしても、2番目のレベルへの参照がある可能性があります。

したがって、次のように、最初のレベル/ディメンションをループして、そこにあるすべての配列をコピーする必要がある場合があります。 ジェネラコディセタグプレ

他のヒント

必要に応じて、次のようにして配列のコピーを簡単に作成できます。 Arrays.copyOf

ディープコピーを作成することもできます。これを行う方法はここで答えられています: 不規則な 2D 配列をディープコピーする方法

はい、Javaは値として配列ではなく配列への参照を渡します。したがって、内部状態への参照を提供すると、レシーバーはそれを変更でき、変更はソースに「表示」されます(実際、変更されたのは1つの配列とすべての参照ホルダーのみです。 変更が表示されます)。

クイックフィックス/ソリューション:状態配列のクローンを作成し、元のクローンではなくこのクローンへの参照を渡します。これにより、内部ルートの状態が変更されないままになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top