public string[] Get_Path(NODE FINAL)
        {
            List <string> PP = new List <string>();

            while (FINAL.Parent != null)
            {
                PP.Add(ARR_MOVES.Values[ARR_MOVES.IndexOfKey(FINAL.move)]);
                FINAL.EQUAL(FINAL.Parent);
            }
            return(PP.ToArray());
        }
        public string[] AStar_SOLVE_USing_HAMMing(int CASE, string FileName1="TEST.txt")
        {
            OPenList = new PaiortyQueue();
            size = ARR2D.read_from_file(ARR, CASE, FileName1);
            NODE X = new NODE(size);
            X.Parent = null;
            X.PUZZLE = getACopy(ARR);
            X.HeuristicValue = Hamming(ARR, size);
            X.move = "";
            X.PuzzleSIze = size;
            X.COSTSOFAR = 0;
            X.calac_Total_using_Hamming();
            OPenList.push(X);
            ClosedList = new SortedDictionary<string, NODE>();
            if (ChecK_Solved())
            {
                while (OPenList.opendlistsize() != 0)
                {

                    NODE CURR = new NODE(size);
                    NODE TEMPNODE = new NODE(size);
                    NODE T = new NODE(size);
                    CURR = OPenList.POP();
                    TEMPNODE.EQUAL(CURR);
                    T.EQUAL(CURR);

                    if (CURR.HeuristicValue == 1)
                    {
                       return Get_Path(CURR);
                    }
                    try
                    {
                        ClosedList.Add(GenerateAKEy(CURR.PUZZLE, CURR.PuzzleSIze), CURR);
                    }
                    catch(Exception E)
                    {
                        MessageBox.Show("OUT OFF MEMORY" , "WRONG" , MessageBoxButtons.OK , MessageBoxIcon.Warning);
                    }
                    //Console.WriteLine("********************************************************");
                    foreach (KeyValuePair<string, string> it in ARR_MOVES)
                    {
                        bool change = false;
                        ARR2D.SETMAINARRANDTEMP(getACopy(CURR.PUZZLE));
                        CURR.PUZZLE = ARR2D.GetTempArr(it.Key, ref change);
                        Num_Hamming = Hamming(CURR.PUZZLE, size);
                        if (change)
                        {
                            string CurentKey = GenerateAKEy(CURR.PUZZLE, size);
                            if (ClosedList.ContainsKey(CurentKey))
                            {

                                NODE NewNode = new NODE(size);
                                ClosedList.TryGetValue(CurentKey, out NewNode);
                                if (Num_Hamming + CURR.COSTSOFAR + 1 < NewNode.TOTAL)
                                {
                                    ClosedList.Remove(CurentKey);
                                    NODE newnode = new NODE(size);
                                    newnode.HeuristicValue = Num_Hamming;
                                    newnode.PUZZLE = getACopy(CURR.PUZZLE);
                                    newnode.PuzzleSIze = size;
                                    newnode.move = it.Key;
                                    newnode.COSTSOFAR = TEMPNODE.COSTSOFAR + 1;
                                    newnode.calac_Total_using_Hamming();
                                    newnode.Parent = TEMPNODE;

                                    OPenList.push(newnode);
                                }
                            }
                            else
                            {
                                NODE newnode = new NODE(size);
                                newnode.HeuristicValue = Num_Hamming;
                                newnode.PUZZLE = getACopy(CURR.PUZZLE);
                                newnode.PuzzleSIze = size;
                                newnode.move = it.Key;
                                newnode.COSTSOFAR = TEMPNODE.COSTSOFAR + 1;
                                newnode.calac_Total_using_Hamming();
                                newnode.Parent = TEMPNODE;

                                OPenList.push(newnode);
                            }
                            change = false;
                            CURR.PUZZLE = ARR2D.GetTempArr(it.Value, ref change);
                        }
                    }

                }

            }
            return null;
        }
        public string[] Get_Path(NODE FINAL)
        {
            List<string> PP = new List<string>();

            while (FINAL.Parent != null)
            {
                PP.Add(ARR_MOVES.Values[ARR_MOVES.IndexOfKey(FINAL.move)]);
                FINAL.EQUAL(FINAL.Parent);
            }
            return PP.ToArray();
        }
        public string[] AStar_SOLVE_using_Mnhaten(int CASE, string FileName1 = "TEST.txt")
        {
            OPenList = new PaiortyQueue();
            size     = ARR2D.read_from_file(ARR, CASE, FileName1);
            NODE X = new NODE(size);

            X.Parent         = null;
            X.PUZZLE         = getACopy(ARR);
            X.HeuristicValue = Manhateen(ARR, size);
            X.move           = "";
            X.PuzzleSIze     = size;
            X.COSTSOFAR      = 0;
            X.calac_Total_using_Manhateen();
            OPenList.push(X);
            ClosedList = new SortedDictionary <string, NODE>();


            int bestlevel;

            bestlevel = int.MaxValue;
            if (ChecK_Solved())
            {
                while (OPenList.opendlistsize() != 0)
                {
                    NODE CURR     = new NODE(size);
                    NODE TEMPNODE = new NODE(size);
                    NODE T        = new NODE(size);
                    CURR = OPenList.POP();
                    TEMPNODE.EQUAL(CURR);
                    T.EQUAL(CURR);

                    if (CURR.HeuristicValue == 0)
                    {
                        return(Get_Path(CURR));
                    }
                    try
                    {
                        ClosedList.Add(GenerateAKEy(CURR.PUZZLE, CURR.PuzzleSIze), CURR);
                    }
                    catch (Exception E)
                    {
                        MessageBox.Show("OUT OFF MEMORY", "WRONG", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }

                    //Console.WriteLine("********************************************************");
                    foreach (KeyValuePair <string, string> it in ARR_MOVES)
                    {
                        bool change = false;
                        ARR2D.SETMAINARRANDTEMP(getACopy(CURR.PUZZLE));
                        CURR.PUZZLE   = ARR2D.GetTempArr(it.Key, ref change);
                        Num_Manhateen = Manhateen(CURR.PUZZLE, size);
                        if (change)
                        {
                            string CurentKey = GenerateAKEy(CURR.PUZZLE, size);
                            if (ClosedList.ContainsKey(CurentKey))
                            {
                                NODE NewNode = new NODE(size);
                                ClosedList.TryGetValue(CurentKey, out NewNode);
                                if (Num_Manhateen + CURR.COSTSOFAR + 1 < NewNode.TOTAL)
                                {
                                    ClosedList.Remove(CurentKey);
                                    NODE newnode = new NODE(size);
                                    newnode.HeuristicValue = Num_Manhateen;
                                    newnode.PUZZLE         = getACopy(CURR.PUZZLE);
                                    newnode.PuzzleSIze     = size;
                                    newnode.move           = it.Key;
                                    newnode.COSTSOFAR      = TEMPNODE.COSTSOFAR + 1;
                                    newnode.calac_Total_using_Manhateen();
                                    newnode.Parent = TEMPNODE;

                                    OPenList.push(newnode);
                                }
                            }
                            else
                            {
                                NODE newnode = new NODE(size);
                                newnode.HeuristicValue = Num_Manhateen;
                                newnode.PUZZLE         = getACopy(CURR.PUZZLE);
                                newnode.PuzzleSIze     = size;
                                newnode.move           = it.Key;
                                newnode.COSTSOFAR      = TEMPNODE.COSTSOFAR + 1;
                                newnode.calac_Total_using_Manhateen();
                                newnode.Parent = TEMPNODE;

                                OPenList.push(newnode);
                            }
                            change      = false;
                            CURR.PUZZLE = ARR2D.GetTempArr(it.Value, ref change);
                        }
                    }
                }
            }
            return(null);
        }