Ханойская башня Наука  Наука 

Ханойская башня

Задача про ханойскую башню, применение

Ханойская башня Наука

Задача Ханойской башни является одной из самых известных головоломок Дальнего Востока. Задача состоит в том чтобы переместить все кольца, нанизанные на один из стержней на другой стержень за наименьшее число ходов. За один ход можно переносить только одно кольцо. Кольца расположены в виде пирамиды от большего к меньшему, и при перемещении колец нельзя класть большее кольцо на меньшее.

Задача легко решается с помощью рекурсии, рассмотрим подробнее реализацию класса.  В общем виде алгоритм решения задачи выглядит так,  где n — количество колец:

  1. Переместить n — 1 кольцо со стержня 1 на стержень 2, используя стержень 3 для временного перемещения колец.

  2. Переместить последнее кольцо (самое большое) со стержня 1 на стержень 3.

  3. Переместить n-1 кольцо со стержня 2 на стержень 3, используя стержень 1 для временного перемещения колец.

 

   public class HanoiTower
   {
      int numRings; // число колец
 
     public HanoiTower( int rings )
     {
       numRings = rings;
     } 

     // применение рекурсии в методе класса HanoiTower  
                             
     public void solveHanoi( int rings, int sourceBar, int destinationBar,
        int tempBar )                                                      
    {   
        // частный случай -- есть только одно кольцо
                                   
       if ( rings == 1 )                                                  
        {                                                                  
           System.out.printf( "\n%d --> %d", sourceBar, destinationBar );  
           return;                                                         
        } // end if 
                                                       
          // применение рекурсии - переместить кольцо на временный стержень, 
          // затем на нужный 
       
        solveHanoi( rings - 1, sourceBar, tempBar, destinationBar );    
        
         // перместить последнее кольцо с исходного стержня на нужный стержень                                                                              
        System.out.printf( "\n%d --> %d", sourceBar, destinationBar ); 
        
         // переместить ( rings - 1 ) колец с временного стержня на нужный стержень                                                                     
        solveHanoi( rings - 1, tempBar, destinationBar, sourceBar );      
     } // конец метода solveHanoi                                           
  } // конец класса HanoiTower

 

Следующий код тестирует решение задачи, на строке 12 создается объект класса HanoiTower, в качестве параметра передается число колец, которые необходимо переместить с одного кольца на другое. На строке 15  вызывается рекурсивный метод solveHanoi, который выводит на экран шаги решения задачи.

  
   // Тестируем решение задачи Ханойской башни.
 
   public class HanoiTest
   {
      public static void main( String args[] )
      {
        int startBar = 1;   // первому стержню присваиваем значение 1
        int endBar = 3;     // конечному стержню присваиваем значение 1
        int tempBar = 2;    // временному стержню присваиваем значение 1
        int totalRings = 3; // число колец
        HanoiTower towersOfHanoi = new HanoiTower( totalRings );

        // нерекурсивный вызов метода: переместить все кольца
        towersOfHanoi.solveHanoi( totalRings, startBar, endBar, tempBar );
     } // конец main
  } // конец класса HanoiTest

Результат выполнения программы:

1 --> 3
1 --> 2
3 --> 2
1 --> 3
2 --> 1
2 --> 3
1 --> 3

 

Похожие записи