Beispiel #1
0
 /// <summary>
 /// Проверка перестановок на равенство
 /// </summary>
 /// <param name="per1"></param>
 /// <param name="per2"></param>
 /// <returns></returns>
 public static bool PerEquals(Permutation per1, Permutation per2)
 {
     bool complete = true;
     for (int currentRow = 0; currentRow < Consts.SIZE; currentRow++)
     {
         for (int currentColumn = 0; currentColumn < Consts.SIZE; currentColumn++)
         {
             if (per1.gameField[currentRow, currentColumn] != per2.gameField[currentRow, currentColumn])
                 complete = false;
         }
     }
     return complete;
 }
        private void Start(object sender, System.Windows.RoutedEventArgs e)
        {
            int[] matr = new int[Consts.SIZE*Consts.SIZE];
            bool ZeroWas = false;
            //Считываем в массив ввеленные пользователем числа
            /*for (int i = 0; i < matr.Length; i++ )
            {
                if (!String.IsNullOrEmpty(((TextBox)Field.Children[i]).Text ))
                {
                    matr[i] = Convert.ToInt32(((TextBox)Field.Children[i]).Text);
                }
                else
                {
                    if (!ZeroWas)
                    {
                        matr[i] = 0;
                        ZeroWas = true;
                    }
                    else
                    {
                        MessageBox.Show("Введите числа");
                        return;
                    }
                }
            }*/

            graph = new Graph(); //Создали граф
            Random r = new Random();
              //  Permutation per = new Permutation(matr);
               Permutation per = new Permutation(new int[] {0,1,2,3,4,5,6,7,8});
            for (int j = 1; j < 50; j++)//проходим по всем вершинам
            {
                int i = r.Next(4);
                Permutation per1 = null;
                switch (i)
                {
                    case 0:
                        per1 = per.Left();
                        break;
                    case 1:
                        per1 = per.Right();
                        break;
                    case 2:
                        per1 = per.Up();
                        break;
                    case 3:
                        per1 = per.Down();
                        break;
                }

                if (per1 != null)
                {
                    per = per1;
                }
            }

                path = graph.Dijkstra(graph.GetNumberOfPermutation(per)); //Нашли путь

                if (path == null)
                {
                    MessageBox.Show("Это конечная");
                }
                else
                {
                currentMtx = path.Count - 1; //Текущая матрица
                Print(per.AllNumbers()); //Отрисовка

                //Timer
                timer = new Timer();
                timer.Interval = 1000;
                timer.Elapsed += TimeIs;
                timer.Start();
                //endTimer
            }
        }
Beispiel #3
0
        /// <summary>
        /// Опускает пустую ячейку вниз (Если возможно)
        /// </summary>
        /// <returns></returns>
        public Permutation Down()
        {
            Permutation per1 = new Permutation(this.gameField);

            int row = 0;
            int column = 0;

            //Нашли столбец и строку в которых 0
            for (int currentRow = 0; currentRow < Consts.SIZE; currentRow++)
            {
                for (int currentColumn = 0; currentColumn < Consts.SIZE; currentColumn++)
                {
                    if (per1.gameField[currentRow, currentColumn] == 0)
                    {
                        row = currentRow;
                        column = currentColumn;
                    }
                }
            }

            //Пытаемся чделать движение вниз
            if (row < Consts.SIZE - 1)
            {
                //выполняем перестановку
                int extra = per1.gameField[row, column];
                per1.gameField[row, column] = per1.gameField[row + 1, column];
                per1.gameField[row + 1, column] = extra;

                return per1;
            }
            return null;
        }
Beispiel #4
0
        /// <summary>
        /// Двигает пустую ячейку влево
        /// </summary>
        /// <returns></returns>
        public Permutation Left()
        {
            Permutation per1 = new Permutation(this.gameField);

            int row = 0;
            int column = 0;

            //Нашли столбец и строку в которых 0
            for (int currentRow = 0; currentRow < Consts.SIZE; currentRow++)
            {
                for (int currentColumn = 0; currentColumn < Consts.SIZE; currentColumn++)
                {
                    if (per1.gameField[currentRow, currentColumn] == 0)
                    {
                        row = currentRow;
                        column = currentColumn;
                    }
                }
            }

            if (column > 0)
            {
                //выполняем перестановку
                int extra = per1.gameField[row, column];
                per1.gameField[row, column] = per1.gameField[row, column - 1];
                per1.gameField[row, column - 1] = extra;

                return per1;
            }
            return null;
        }
Beispiel #5
0
 /// <summary>
 /// Создает перестановку в массиве graphModel, находящуюся в нем под номером currentPer, передавая в конструктор перестановки конкретный массив
 /// </summary>
 /// <param name="arrayOfPer"></param>
 public void CreatePermutation(int[] arrayOfPer)
 {
     graphModel[currentPer] = new Permutation(arrayOfPer);
     currentPer++;
 }
Beispiel #6
0
 /// <summary>
 /// По перестановке определяет ее лексикографический номер
 /// </summary>
 /// <param name="per"></param>
 /// <returns></returns>
 public int GetNumberOfPermutation(Permutation per)
 {
     return per.GetNum(0);
 }