Искаженная башня Ханоя Проблема
Базовую версию Ханойской башни можно найти здесь.
Это запутанная проблема Ханойской башни. В котором все правила одинаковы с добавлением правила:
Вы не можете переместить диск непосредственно от первого стержня к последнему стержню, т.е. если вы хотите переместить диск от первого стержня к последнему стержню, вам нужно сначала переместить первый стержень к среднему стержню, а затем к последнему. .
Подход:
- Базовый случай: если количество дисков 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 movesvoid 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 Codeint 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 approachimport java.util.*;class GFG{// Function to print the movesstatic 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 Codepublic 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 movesdef 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 disksn = 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 approachusing System; class GFG{// Function to print the movesstatic 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 Codepublic 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 movesfunction 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 disksvar 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.