Ханойские башни - C# (189740)
Формулировка задачи:
Просидел над алгоритмом решения этих хайнойских башенок около 6 часов, так и не понял,как его реализовать в c#.
По сути,задание,которое дали,разобраться в готовом решении для этой задачи.Вот оно:
Как не пытался его обуздать,не получилось.В общем,к чему я пришёл:
1)Для чётного и нечётного количества алгоритм будет отличаться
2)Я затупок
В общем, сижу с головной болью.Понимаю,как оно решается в теоретическом плане,не могу реализовать или же понять то,что уже имеется.
Буду рад,если кто-нибудь поможет разложить всё по полочкам.Может не только мне пригодится.
private void button1_Click(object sender, EventArgs e)
{
h = new Stack<int>[3];
h[0] = new Stack<int> ( );
h[1] = new Stack<int> ( );
h[2] = new Stack<int> ( );
h[0].Push(8);
h[0].Push(7);
h[0].Push(6);
h[0].Push(5);
h[0].Push(4);
h[0].Push(3);
h[0].Push(2);
h[0].Push(1);
Hanoi(1, 3, 8);
}
private void Hanoi(int from, int to, int c)
{
int to2 = 6 - from - to; //to2 – номер промежуточной башни
if (c > 1)
{
Hanoi(from, to2, c – 1);
Hanoi(from, to, 1);
Hanoi(to2, to, c – 1);
}
else
{
h[to - 1].Push(h[from - 1].Pop());
}
}
Вроде,если упростить пример до 2-x дисков,то всё становится на свои места и проясняется.Думаю,что я понял алгоритм.
Решение задачи: «Ханойские башни»
textual
Листинг программы
using System;
namespace HanoiTowers
{
class Program
{
//start - откуда кладем, end - куда кладем, temp - промежуточный диск, disks - кол-во дисков
static void MoveDisks(int start, int temp, int end, int disks)
{
if (disks > 1)
MoveDisks(start, end, temp, disks-1); //(шаг №1)
Console.WriteLine("{0} -> {1}", start, end); //(шаг №2)
if (disks > 1)
MoveDisks(temp, start, end, disks-1); //(шаг №3)
}
static void Main(string[] args)
{
int start = 1;
int temp = 2;
int end = 3;
MoveDisks(start, temp, end, 4);
}
}
}