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