汉诺塔的一些研究以及C#版演示程序
说来惭愧,一直没有机会正二八经研究汉诺塔。
最近一直在学习算法,就又把汉诺塔拿出来学习了一下,再次感受到递归的经典应用。
学习的同时做了一个C#版的演示程序,大家可以下载源代码并编译执行(基于.net 2.0)。
这里是核心代码(请重点关注黄色高亮部分代码)
代码
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace Hanoi
6 {
7 class HanoiData
8 {
9 public Dictionary<string, List<int>> diskList = new Dictionary<string, List<int>>();
10 public int diskCount;
11
12 public HanoiData(int diskCount)
13 {
14 this.diskCount = diskCount;
15
16 diskList.Add("x", new List<int>());
17 diskList.Add("y", new List<int>());
18 diskList.Add("z", new List<int>());
19
20 for (int i = 0; i < diskCount; i++)
21 {
22 diskList["x"].Add(i);
23 }
24 }
25
26 public void Move(string sourceStick, string targetStick)
27 {
28 try
29 {
30 diskList[targetStick].Insert(0, diskList[sourceStick][0]);
31 diskList[sourceStick].RemoveAt(0);
32 }
33 catch
34 {
35 }
36 }
37
38 public List<Step> GenerateSteps()
39 {
40 List<Step> stepList = new List<Step>();
41 GenerateSteps(stepList, diskCount, "x", "y", "z");
42 return stepList;
43 }
44
45 private void GenerateSteps(List<Step> stepList, int index,string startStick, string middleStick, string endStick)
46 {
47 if (index == 1)
48 {
49 stepList.Add(new Step(startStick, endStick));
50 }
51 else
52 {
53 GenerateSteps(stepList, index-1, startStick, endStick, middleStick);
54 stepList.Add(new Step(startStick, endStick));
55 GenerateSteps(stepList, index - 1, middleStick, startStick, endStick);
56 }
57 }
58 }
59
60 public class Step
61 {
62 public string sourceStick;
63 public string targetStick;
64
65 public Step(string sourceStick, string targetStick)
66 {
67 this.sourceStick = sourceStick;
68 this.targetStick = targetStick;
69 }
70 }
71 }
72
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace Hanoi
6 {
7 class HanoiData
8 {
9 public Dictionary<string, List<int>> diskList = new Dictionary<string, List<int>>();
10 public int diskCount;
11
12 public HanoiData(int diskCount)
13 {
14 this.diskCount = diskCount;
15
16 diskList.Add("x", new List<int>());
17 diskList.Add("y", new List<int>());
18 diskList.Add("z", new List<int>());
19
20 for (int i = 0; i < diskCount; i++)
21 {
22 diskList["x"].Add(i);
23 }
24 }
25
26 public void Move(string sourceStick, string targetStick)
27 {
28 try
29 {
30 diskList[targetStick].Insert(0, diskList[sourceStick][0]);
31 diskList[sourceStick].RemoveAt(0);
32 }
33 catch
34 {
35 }
36 }
37
38 public List<Step> GenerateSteps()
39 {
40 List<Step> stepList = new List<Step>();
41 GenerateSteps(stepList, diskCount, "x", "y", "z");
42 return stepList;
43 }
44
45 private void GenerateSteps(List<Step> stepList, int index,string startStick, string middleStick, string endStick)
46 {
47 if (index == 1)
48 {
49 stepList.Add(new Step(startStick, endStick));
50 }
51 else
52 {
53 GenerateSteps(stepList, index-1, startStick, endStick, middleStick);
54 stepList.Add(new Step(startStick, endStick));
55 GenerateSteps(stepList, index - 1, middleStick, startStick, endStick);
56 }
57 }
58 }
59
60 public class Step
61 {
62 public string sourceStick;
63 public string targetStick;
64
65 public Step(string sourceStick, string targetStick)
66 {
67 this.sourceStick = sourceStick;
68 this.targetStick = targetStick;
69 }
70 }
71 }
72
同样,照例贴上一段五阶汉诺塔的演示动画。(原来五阶汉诺塔需要30步走完).