C#解決漢諾塔問題DEMO
更新時間:2015年05月23日 12:13:31 投稿:junjie
這篇文章主要介紹了C#解決漢諾塔問題DEMO,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
漢諾塔問題是學(xué)習(xí)遞歸的入門問題,這里用C#簡單實現(xiàn)了一個漢諾塔之間傳遞盤子的小程序
通過簡單繪圖實現(xiàn)盤子在幾個塔之間的轉(zhuǎn)換:
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;//盤子個數(shù) 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> /// 漢諾塔核心遞歸函數(shù) /// </summary> /// <param name="n">盤子個數(shù)</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> /// 盤子移動畫圖實現(xiàn) /// </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(); } } }
相關(guān)文章
C#使用BitConverter與BitArray類進行預(yù)定義基礎(chǔ)類型轉(zhuǎn)換
這篇文章介紹了C#使用BitConverter與BitArray類進行預(yù)定義基礎(chǔ)類型轉(zhuǎn)換的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05c#實現(xiàn)從字符串?dāng)?shù)組中把數(shù)字的元素找出來
下面小編就為大家分享一篇c#實現(xiàn)從字符串?dāng)?shù)組中把數(shù)字的元素找出來的方法,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12C#實現(xiàn)將javascript文件編譯成dll文件的方法
這篇文章主要介紹了C#實現(xiàn)將javascript文件編譯成dll文件的方法,涉及C#編譯生成dll動態(tài)鏈接庫文件的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11C#使用Fody實現(xiàn)監(jiān)控方法執(zhí)行時間
這篇文章主要為大家詳細介紹了C#如何使用Fody實現(xiàn)監(jiān)控方法執(zhí)行時間,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解下2023-11-11