汉诺塔的一些研究以及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 


同样,照例贴上一段五阶汉诺塔的演示动画。(原来五阶汉诺塔需要30步走完).

 

posted on 2009-12-10 16:51  林大虾  阅读(919)  评论(3编辑  收藏  举报

导航