1- توصيف الحالة: في ملف newState يوجد صف State class يحوي 2 attributes : 1- current board وهو الرقعة الحالية 2- root state وهو الحالة الابتدائية للرقعة ويتم تخزينه في الرقعة الابتدائية للشجرة تم استخدام بينة المعطيات الاساسية tree اسم الصف TreeNode تحوي 2 attributes 1- value قيمة العقدة 2- children وهي قائمة تحوي ابناء هذه العقدة لدينا ايضا class Cell وهو يحوي 5 انواع للخلايا red, purple, metal, circle, empty ويتم في Board class انشاء الرقعة وتحوي 3 attributes 1- size حجم الرقعة (size x size) 2- cells [][] قائمة ثنائية البعد تحوي كائنات للخلايا 3- o_positions [] وهي قائمة تحوي مواقع الخلايا الدائرية او الاهداف
2- فضاء الحالات: يحوي صف State تابع لانشاء حالات جديدة من الرقعة الحالية باستخدام توابع من صف Board الذي يقوم يتوليد رقعات جديدة من الرقعة الحالية من خلال تحريك مغناطيس وتطبيق تأثيره على الخلايا الحديدية، ويتم وضع كل رقعة جديدة في حالة منفصلة ثم يتم وضع كل حالة من هذه الحالات في عقدة منفصلة من الشجرة. 3- الحالة الابتدائية: لانشاء رقعة نعرف object من صف Board ونمرر الحجم، ثم نبدأ بوضع الخلايا باستخدام تابع setCell ونمرر له السطر و العمود و لون الخلية.
3- العمليات والاجراءات: class Cell: تابع initSymbol: لتهيئة رموز الرقعة تابع setPosition: لوضع موقع الخلية التي يتم تمريرها تابع isEmpty: للتاكد من الخلية اذا كانت فارغة class Board: توابع setCell , getCell: لتهيئة و جلب خلية معينة من الرقعة توابع لايجاد خليتي المغناطيسين الاحمر و البنفسجي findPurplePosition , findRedPosition تابع لازالة خلية من الرقعة removeCell تابع لتحريك خلية في الرقعة ويرجع رقعة جديدة بعد التحريك moveCell تابع لطباعة الرقعة تابع للتاكد من ان الخلية داخل حدود الرقعة تابع للحصول على جوارات خلية neighbors تابع للتاكد من الرقعة اذا كانت محلولة تابع للمغناطيس الاحمر للجذب redCellAttraction و تباع للمغناطيس البنفسجي للتنافر purpleCellRepulion تابع لنسخ object من الرقعة board تابع يرجع السطر والعمود لخلية getCellRowAndColumn توابع ترجع lists تحوي الاماكن او المواقع positions الممكن تحريك المغناطيس الاحمر او البنفسجي اليها توابع ترجع lists تحوي رقعات boards جديدة بعد تحريك المغناطيسات لاحد الاماكن الممكنة generateNewRedBoards , generateNewPurpleBoards class State: تابع لاضافة حالة ابن للحالة الابتدائية او الحالية توابع لتوليد حالات جديدة من الرقعات التي تم توليدها في صف Board و تخزينها في عقدة بالشجرة
4- الحالة النهائية : نقوم بالتحقق اذا كان لا يزال يوجد اهداف (خلايا دائرية) في الرقعة، اذا لم يبقى فقد وصلنا للحل، والحل هو عبارة عن رقعة board الموجودة بالحالة التي وجد عندها الهدف goal.
Dfs & Bfs: 1- بنية المعطيات: Dfs => stack ، Bfs => Queue 2- آلية الحل: dfs: تبدأ بمكدس يحوي الحالة الابتدائية و set نضع فيه الحالات التي تمت زيارتها نقوم باخذ الحالة الابتدائية من المكدس (نحذفها من المكدس) و نضيفها لل explored_set ثم نقوم بتوليد جميع الحالات الممكنة من الحالة الابتدائية و تخزين كل حالة من هذه الحالات في ال stack ثم نتحقق اذا كانت هذه الحالة هي حل للرقعة نكرر هذه الخطوات على كل عنصر داخل المكدس حتى نصل للحال اما اذا كان المكدس فارغ فلا يوجد حل bfs: نفس خطوات ال dfs ولكن نستخدم queue بدلا من stack 3- الحل: بعد الوصول للحالة الهدف يتم التوقف عن المرور على الحالا ويتم طباعة الحالة الهدف.