Искаженная башня Ханоя Проблема
Базовую версию Ханойской башни можно найти здесь.
Это запутанная проблема Ханойской башни. В котором все правила одинаковы с добавлением правила:
Вы не можете переместить диск непосредственно от первого стержня к последнему стержню, т.е. если вы хотите переместить диск от первого стержня к последнему стержню, вам нужно сначала переместить первый стержень к среднему стержню, а затем к последнему. .
Подход:
- Базовый случай: если количество дисков 1, сначала переместите его на средний стержень, а затем переместите на последний стержень.
- Рекурсивный случай: в рекурсивном случае следующие шаги приведут к оптимальному решению: (Все эти ходы следуют правилам извращенной задачи Ханойской башни)
- Сначала мы переместим первые n-1 дисков на последнюю штангу.
- Затем переместите самый большой диск на средний стержень.
- Переместите первый диск n-1 от последнего стержня к первому стержню.
- Переместите самый большой диск от среднего стержня к последнему стержню.
- Переместите все диски n-1 от первого стержня к последнему стержню.
Below is the implementation of the above approach:
C++
// C++ implementation #include <iostream> using namespace std; // Function to print the moves void twistedTOH( int n, char first, char middle, char last) { // Base case if (n == 1) { cout << "Move disk " << n << " from rod " << first << " to " << middle << " and then to " << last << endl; return ; } // Move n-1 disks from first to last twistedTOH(n - 1, first, middle, last); // Move largest disk from first to middle cout << "Move disk " << n << " from rod " << first << " to " << middle << endl; // Move n-1 disks from last to first twistedTOH(n - 1, last, middle, first); // Move nth disk from middle to last cout << "Move disk " << n << " from rod " << middle << " to " << last << endl; // Move n-1 disks from first to last twistedTOH(n - 1, first, middle, last); } // Driver"s Code int main() { // Number of disks int n = 2; // Rods are in order // first(A), middle(B), last(C) twistedTOH(n, "A" , "B" , "C" ); return 0; } |
Java
// Java implementation of the approach import java.util.*; class GFG { // Function to print the moves static void twistedTOH( int n, char first, char middle, char last) { // Base case if (n == 1 ) { System.out.println( "Move disk " + n + " from rod " + first + " to " + middle + " and then to " + last); return ; } // Move n-1 disks from first to last twistedTOH(n - 1 , first, middle, last); // Move largest disk from first to middle System.out.println( "Move disk " + n + " from rod " + first + " to " + middle); // Move n-1 disks from last to first twistedTOH(n - 1 , last, middle, first); // Move nth disk from middle to last System.out.println( "Move disk " + n + " from rod " + middle + " to " + last); // Move n-1 disks from first to last twistedTOH(n - 1 , first, middle, last); } // Driver Code public static void main(String[] args) { // Number of disks int n = 2 ; // Rods are in order // first(A), middle(B), last(C) twistedTOH(n, "A" , "B" , "C" ); } } // This code is contributed by PrinciRaj1992 |
Python3
# Python3 implementation of above approach # Function to print the moves def twistedTOH(n, first, middle, last): # Base case if (n = = 1 ): print ( "Move disk" , n, "from rod" , first, "to" , middle, "and then to" , last) return # Move n-1 disks from first to last twistedTOH(n - 1 , first, middle, last) # Move largest disk from first to middle print ( "Move disk" , n, "from rod" , first, "to" , middle) # Move n-1 disks from last to first twistedTOH(n - 1 , last, middle, first) # Move nth disk from middle to last print ( "Move disk" , n, "from rod" , middle, "to" , last) # Move n-1 disks from first to last twistedTOH(n - 1 , first, middle, last) # Driver Code # Number of disks n = 2 # Rods are in order # first(A), middle(B), last(C) twistedTOH(n, "A" , "B" , "C" ) # This code is contributed by # divyamohan123 |
C#
// C# implementation of the approach using System; class GFG { // Function to print the moves static void twistedTOH( int n, char first, char middle, char last) { // Base case if (n == 1) { Console.WriteLine( "Move disk " + n + " from rod " + first + " to " + middle + " and then to " + last); return ; } // Move n-1 disks from first to last twistedTOH(n - 1, first, middle, last); // Move largest disk from first to middle Console.WriteLine( "Move disk " + n + " from rod " + first + " to " + middle); // Move n-1 disks from last to first twistedTOH(n - 1, last, middle, first); // Move nth disk from middle to last Console.WriteLine( "Move disk " + n + " from rod " + middle + " to " + last); // Move n-1 disks from first to last twistedTOH(n - 1, first, middle, last); } // Driver Code public static void Main(String[] args) { // Number of disks int n = 2; // Rods are in order // first(A), middle(B), last(C) twistedTOH(n, "A" , "B" , "C" ); } } // This code is contributed by PrinciRaj1992 |
Javascript
<script> // Javascript program // Function to print the moves function twistedTOH(n, first, middle, last) { // Base case if (n == 1) { document.write( "Move disk " + n + " from rod " + first + " to " + middle + " and then to " + last + "<br>" ); return ; } // Move n-1 disks from first to last twistedTOH(n - 1, first, middle, last); // Move largest disk from first to middle document.write( "Move disk " + n + " from rod " + first + " to " + middle + "<br>" ); // Move n-1 disks from last to first twistedTOH(n - 1, last, middle, first); // Move nth disk from middle to last document.write( "Move disk " + n + " from rod " + middle + " to " + last + "<br>" ); // Move n-1 disks from first to last twistedTOH(n - 1, first, middle, last); } // driver code // Number of disks var n = 2; // Rods are in order // first(A), middle(B), last(C) twistedTOH(n, "A" , "B" , "C" ); // This code contributed by shivani </script> |
Move disk 1 from rod A to B and then to C Move disk 2 from rod A to B Move disk 1 from rod C to B and then to A Move disk 2 from rod B to C Move disk 1 from rod A to B and then to C
Формула повторяемости:
T(n) = T(n-1) + 1 + T(n-1) + 1 + T(n-1) = 3 * T(n-1) + 2 where n is the number of disks.
Решив это повторение, сложность времени будет O (3 n ) .
Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью самостоятельного курса DSA по приемлемой для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .
Если вы хотите посещать живые занятия с отраслевыми экспертами, пожалуйста, обращайтесь к Geeks Classes Live и Geeks Classes Live USA.