- 汉诺塔是由三根杆子A,B,C组成的。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘;大盘不能叠在小盘上面。提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须尊循上述两条规则。问:如何移?最少要移动多少次?汉诺塔是根据一个传说形成的一个问题:
有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:
每次只能移动一个圆盘; 大盘不能叠在小盘上面。
提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须尊循上述两条规则。 问:如何移?最少要移动多少次?
namespace MyProject
{
class Program
{
static void Main(string[] args)
{
Stack<int> a = new Stack<int>();
a.Push(6); a.Push(5); a.Push(4); a.Push(3); a.Push(2); a.Push(1);
HeNeiTA heNeiTAa = new HeNeiTA
{
stack = a,
stacklx = "A"
};
Stack<int> b = new Stack<int>();
HeNeiTA heNeiTAb = new HeNeiTA
{
stack = b,
stacklx = "B"
};
Stack<int> c = new Stack<int>();
HeNeiTA heNeiTAc = new HeNeiTA
{
stack = c,
stacklx = "C"
};
heta(6, heNeiTAa, heNeiTAb, heNeiTAc);
}
public class HeNeiTA {
public Stack<int> stack;
public string stacklx;
}
public static void heta(int nums, HeNeiTA a, HeNeiTA b, HeNeiTA c)
{
if (nums == 1)
{
int zd = a.stack.Pop();
c.stack.Push(zd);
PrintLn(a, b, c, "A");
PrintLn(a, b, c, "B");
PrintLn(a, b, c, "C");
Console.WriteLine();
}
else
{
heta(nums - 1, a, c, b);//a给b(nums-1)
heta(1, a, b, c);//a给c
heta(nums - 1, b, a, c);//b给c(nums-1)
}
}
public static void PrintLn(HeNeiTA a, HeNeiTA b, HeNeiTA c,string lx)
{
string List = "[";
if (a.stacklx == lx) {
foreach (int i in a.stack)
{
List += i + ",";
}
List = List.Trim(',');
}else if (b.stacklx == lx) {
foreach (int i in b.stack)
{
List += i + ",";
}
List = List.Trim(',');
}else if (c.stacklx == lx) {
foreach (int i in c.stack)
{
List += i + ",";
}
List = List.Trim(',');
}
List += "] ";
Console.Write(List);
}
}
}