Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Oleg Khovayko [SPAM trap - don't re  2:5020/400     04 Apr 2003  16:07:45
 To : anton yakovlev
 Subject : Re: Алгоритм реализации "пятнашек" с полем 3x3?
 -------------------------------------------------------------------------------- 
 
 
 
 anton yakovlev wrote:
 
 > пронумерованных от 1 до 8. Выдать последовательность перемещений, необходимую
 > для перевода "пятнашек" в стандартное состояние. (Под стандартным понимается
 > такое состояние ((1,2,3),(4,5,6),(7,8,0)) - по рядам).
 > 
 
 Решение - поиск в ширину. Гарантирует нахождение наиболее короткого пути 
 к цели.
 
 Делаешь так:
 
 0. Структура данных.
 
 0.1. Состояние доски с пятнашками. Очевидно, его можно хранить в виде 
 9-и значного десятичного числа int-a.
 
 0.2. Вводишь функцию "сдвинуть пустышку":
   int move_empty(int cur_board, int direction);
 Hа входе она берет текущее состояние доски и направление, на выходе
 возвращает новое состояние доски. Реализуется такая функция через
 вспомагательный массив перестановок 9x4x2.
 Если движение пустышкив данном направлении невозможно, функция 
 возвращает ноль.
 
 0.3. Вводишь map <int, int> M; где хранишь пары: тек.
 состояние -> пред. состояние.
 
 0.4. Вводишь очередь обхода queue<int> Q.
 Алгоритм:
 
 1. Инициализация:
 1.1. M[0] = 0; M[начальное состояние] = 0; Положили в map заглушки.
 1.2. Q.push_back(начальное состояние); Положили в очередь начальное 
 состояние.
 
 2. Поехали!
 while(Q.empty()) {
   int cur_board = Q.front(); // Выташили очередное сотояние из очереди
   q.pop(); // Может, ошибаюсь с именем метода.
               Hужно просто удалить вытащеный ранее
               элемент из головы очереди.
   if(cur_board == 12345678890) { // Если дошли до цели -
     do { // Печатаем найденый путь перестановок
      PRINT cur_board;
      cur_board = M[cur_board];
     } while(cur_board);
     exit(); // И выходим
   }
   // Цель еще не достигнута
   // Пытаемся пойти по всем направлениям
   for(int dir_move = 0; dir_move < 4; dir_move++) {
     int next_board = move_empty(cur_board, dir_move);
     if(M.count(next_board) == 0) { // Если в таком новом состоянии еще 
 не были:
       M[next_board] = cur_board; // Запомним его и его предка
       Q.push_back(cur_board); // и положим в очередь на анализ
     } // if M
   } // for dir
 } // while Q
 
 PRINT "Hет решения";
 -- 
 #include <best/regards>
 Oleg Khovayko  http://olegh.spedia.net
 PS/ATTN: Reply to reverted address net.comcast@olegh
 
 --- ifmail v.2.15dev5
  * Origin: http://www.ftc.gov/opa/2001/04/spam.htm (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Алгоритм реализации "пятнашек" с полем 3x3?   anton yakovlev   04 Apr 2003 00:01:02 
 Алгоритм реализации "пятнашек" с полем 3x3?   Aliaksandr Kuznetsou   04 Apr 2003 13:13:49 
 Re: Алгоритм реализации "пятнашек" с полем 3x3?   Oleg Khovayko [SPAM trap - don\'t re   04 Apr 2003 16:07:45 
 Re: Алгоритм реализации "пятнашек" с полем 3x3?   Oleg Khovayko [SPAM trap - don\'t re   04 Apr 2003 16:14:56 
 Алгоритм реализации "пятнашек" с полем 3x3?   Mity Usanov   04 Apr 2003 21:09:37 
Архивное /ru.algorithms/5488cb1c6c79.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional