C# 汉诺塔问题简单演示
来源:互联网 发布:win10软件权限设置 编辑:程序博客网 时间:2024/06/05 01:13
汉诺塔问题是学习递归的入门问题,这里用C#简单实现了一个汉诺塔之间传递盘子的小程序
通过简单绘图实现盘子在几个塔之间的转换:
namespace 汉诺塔{ //盘子类 class HanioItem { public int HanoiItemHeight { get; set; }//盘子的高度 public int HanoiItemWidth { get; set; }//盘子的宽度 public Point HanoiItemPoint { get; set; }//画盘子的起始点 }}
namespace 汉诺塔{ public partial class FrmShow : Form { List<HanioItem> HanioItemsA = new List<HanioItem>();//塔A中的盘子集合 List<HanioItem> HanioItemsB = new List<HanioItem>();//塔B中的盘子集合 List<HanioItem> HanioItemsC = new List<HanioItem>();//塔C中的盘子集合 Pen p;//画笔 Graphics hanioPicA;//塔A的画布 Graphics hanioPicB;//塔B的画布 Graphics hanioPicC;//塔C的画布 int tag;//盘子个数 public FrmShow() { InitializeComponent(); } /// <summary> /// 初始化3个PictureBox画布 /// </summary> public void InitialTools() { p = new Pen(Color.Black); hanioPicA = HanoiPicA.CreateGraphics(); hanioPicB = HanoiPicB.CreateGraphics(); hanioPicC = HanoiPicC.CreateGraphics(); } public void InitialGraphics() { int HanioItemHeight = 15;//塔中盘子的高度 int HanioStartItemWidth = 90;//第一个盘子的宽 Point HanioStartItemP = new Point(15, 135);//第一个盘子起始点 InitialTools(); tag = Convert.ToInt16(this.Tag.ToString()); HanioItemsA.Clear(); HanioItemsB.Clear(); HanioItemsC.Clear(); //初始化塔A上的盘子 int diffrence = (90 - 30) / tag;//两个盘子之间宽度之差 for (int i = 1; i <= tag; i++) { HanioItem item = new HanioItem(); item.HanoiItemWidth = HanioStartItemWidth; item.HanoiItemHeight = HanioItemHeight; item.HanoiItemPoint = HanioStartItemP; HanioItemsA.Add(item); HanioStartItemWidth -= diffrence; HanioStartItemP.X += diffrence / 2; } //为汉诺塔画盘子 ShowHanoiGraphics(); } /// <summary> /// 画3个塔中的盘子 /// </summary> private void ShowHanoiGraphics() { hanioPicA.Clear(this.BackColor); hanioPicB.Clear(this.BackColor); hanioPicC.Clear(this.BackColor); //为汉诺塔A画初始线条 hanioPicA.DrawLine(p, 0, 150, 120, 150); hanioPicA.DrawLine(p, 60, 0, 60, 150); //为汉诺塔B画初始线条 hanioPicB.DrawLine(p, 0, 150, 120, 150); hanioPicB.DrawLine(p, 60, 0, 60, 150); //为汉诺塔C画初始线条 hanioPicC.DrawLine(p, 0, 150, 120, 150); hanioPicC.DrawLine(p, 60, 0, 60, 150); //画A塔的盘子 for (int i = 0; i < HanioItemsA.Count; i++) { hanioPicA.DrawRectangle(p, HanioItemsA[i].HanoiItemPoint.X, HanioItemsA[i].HanoiItemPoint.Y - i * 15, HanioItemsA[i].HanoiItemWidth, HanioItemsA[i].HanoiItemHeight); } //画B塔的盘子 for (int i = 0; i < HanioItemsB.Count; i++) { hanioPicB.DrawRectangle(p, HanioItemsB[i].HanoiItemPoint.X, HanioItemsB[i].HanoiItemPoint.Y - i * 15, HanioItemsB[i].HanoiItemWidth, HanioItemsB[i].HanoiItemHeight); } //画C塔的盘子 for (int i = 0; i < HanioItemsC.Count; i++) { hanioPicC.DrawRectangle(p, HanioItemsC[i].HanoiItemPoint.X, HanioItemsC[i].HanoiItemPoint.Y - i * 15, HanioItemsC[i].HanoiItemWidth, HanioItemsC[i].HanoiItemHeight); } } /// <summary> /// 汉诺塔核心递归函数 /// </summary> /// <param name="n">盘子个数</param> /// <param name="A">塔A</param> /// <param name="B">塔B</param> /// <param name="C">塔C</param> private void Hanio(int n, List<HanioItem> A, List<HanioItem> B, List<HanioItem> C) { if (n == 1) { HanioMove(A, C); } else { Hanio(n - 1, A, C, B); HanioMove(A, C); Hanio(n-1,B,A,C); } } /// <summary> /// 盘子移动画图实现 /// </summary> private void HanioMove(List<HanioItem> X, List<HanioItem> Y) { HanioItem item = new HanioItem(); item = X[X.Count-1]; X.Remove(item);//塔X移除一个盘子 Y.Add(item); //塔Y添加一个盘子 ShowHanoiGraphics(); System.Threading.Thread.Sleep(1000); } private void btnOK_Click(object sender, EventArgs e) { Hanio(tag, HanioItemsA, HanioItemsB, HanioItemsC); } private void FrmShow_Paint(object sender, PaintEventArgs e) { InitialGraphics(); } }}
- C# 汉诺塔问题简单演示
- C#多线程的竞态问题演示
- C#向EXCEL自动写数据简单演示
- C#事件演示程序1)——一个最简单的C#事件处理程序
- C#泛型演示
- C#泛型演示
- 克隆帐户简单演示
- 二、功能简单演示
- DataSet简单演示
- MSSQL简单循环演示
- vbo 简单演示
- spring+servlet 简单演示
- 筛法 简单演示程序
- MongoDB简单实例演示
- poco 简单使用演示
- MVC4 简单异步演示
- iOS生命周期简单演示
- freemaker简单演示
- 理解ThreadLocal
- C++指针的教程
- MFC中CImage的简单复制方法 (Copy CImage)
- IOS开发之UISearchBar应用
- ATL Internals 2ed复习.chapter 7.ATL Persistence implements
- C# 汉诺塔问题简单演示
- 数据结构——C++栈
- 初探android的Camera和Matrix
- neuq 1024 万能遥控器
- Unix/Linux 进程间通信之消息队列应用实例
- 网易校园招聘考察知识点--缺省参数是编译期间绑定的,而不是动态绑定
- IOS开发之CocoaAsyncSocket学习
- Ubuntu使用自我mark
- 你的团队最佳人数是多少