سؤال

يا الناس لدي هذا الهيكل لشجرة البحث

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);

بعد نهاية العودية في وظيفة القيمة القصوى ، لا ينبغي تحرير المصفوفة في الجذر منذ الحالة الأولى ولكن عندما أعرضها أحصل على مصفوفة مليئة بالأشياء مما يعني أن الجذر.الدولة مرت بالرجوع إلى وظيفة القيمة القصوى: (

// أحاول تنفيذ خوارزمية مينيماكس.

هل كانت مفيدة؟

المحلول

إذا كنت لا تريد تغيير الكائنات التي تم تمريرها كمعلمات ، فقم بتمرير نسخة (أو قم بعمل نسخة من المعلمة داخل الطريقة).

لاحظ أن char[][] يعني أن لديك مجموعة من صفائف شار ، أي.كنت تعمل مع الكائنات وإذا قمت بنسخ المستوى الأول لا يزال قد يكون لديك إشارة إلى الثانية.

وبالتالي قد تضطر إلى حلقة من خلال المستوى الأول / البعد ونسخ جميع المصفوفات في هناك ، مثل هذا:

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

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

نصائح أخرى

إذا كنت في حاجة، يمكنك بسهولة إنشاء نسخة من المصفوفة من خلال Arrays.copyOf

يمكنك أيضًا إنشاء نسخة عميقة.وقد تم الرد على كيفية القيام بذلك هنا: كيفية النسخ العميق لمصفوفة ثنائية الأبعاد غير منتظمة

نعم، يمر Java المراجع إلى صفائف وليس الصفيف كقيمة.لذلك إذا قمت بإعطاء إشارة إلى حالتك الداخلية بعيدا، فإن المتلقي يمكن أن يغيره والتغيير هو "مرئي" في المصدر (في الواقع: إنه فقط صفيف واحد تم تغييره وجميع حاملي المراجعسوف نرى التغيير).

الإصلاح السريع / الحل: استنساخ صفيف الحالة الخاصة بك وتمرير مرجع إلى هذا الاستنساخ بدلا من الأصل.سيحتفظ بهذا الدولة الجذر الداخلية الخاصة بك بدون إصلاح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top