C#解決漢諾塔問(wèn)題DEMO
漢諾塔問(wèn)題是學(xué)習(xí)遞歸的入門問(wèn)題,這里用C#簡(jiǎn)單實(shí)現(xiàn)了一個(gè)漢諾塔之間傳遞盤子的小程序

通過(guò)簡(jiǎn)單繪圖實(shí)現(xiàn)盤子在幾個(gè)塔之間的轉(zhuǎn)換:
namespace 漢諾塔
{
//盤子類
class HanioItem
{
public int HanoiItemHeight { get; set; }//盤子的高度
public int HanoiItemWidth { get; set; }//盤子的寬度
public Point HanoiItemPoint { get; set; }//畫盤子的起始點(diǎn)
}
}
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;//盤子個(gè)數(shù)
public FrmShow()
{
InitializeComponent();
}
/// <summary>
/// 初始化3個(gè)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;//第一個(gè)盤子的寬
Point HanioStartItemP = new Point(15, 135);//第一個(gè)盤子起始點(diǎn)
InitialTools();
tag = Convert.ToInt16(this.Tag.ToString());
HanioItemsA.Clear();
HanioItemsB.Clear();
HanioItemsC.Clear();
//初始化塔A上的盤子
int diffrence = (90 - 30) / tag;//兩個(gè)盤子之間寬度之差
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個(gè)塔中的盤子
/// </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">盤子個(gè)數(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>
/// 盤子移動(dòng)畫圖實(shí)現(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移除一個(gè)盤子
Y.Add(item); //塔Y添加一個(gè)盤子
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# Lambda表達(dá)式select()和where()的區(qū)別及用法
這篇文章主要介紹了C# Lambda表達(dá)式select()和where()的區(qū)別及用法,select在linq中一般會(huì)用來(lái)提取最后篩選的元素集合,在lambda表達(dá)式中通常用where得到元素集合,需要的朋友可以參考下2023-07-07
基于C#實(shí)現(xiàn)任意格式JSON文本的HTTP交互抽象類
為了實(shí)現(xiàn)一個(gè)支持任意格式JSON交互的抽象類,并且在整個(gè)過(guò)程中不需要對(duì)JSON格式數(shù)據(jù)進(jìn)行序列化和反序列化操作,可以使用C#中的HttpClient類來(lái)進(jìn)行HTTP請(qǐng)求和響應(yīng),本文給大家介紹了基于C#實(shí)現(xiàn)任意格式JSON文本的HTTP交互抽象類,需要的朋友可以參考下2025-03-03
C#開(kāi)發(fā)Windows UWP系列之3D變換
這篇文章介紹了C#開(kāi)發(fā)Windows UWP系列之3D變換,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
C#實(shí)現(xiàn)強(qiáng)制關(guān)閉當(dāng)前程序進(jìn)程
這篇文章主要介紹了C#實(shí)現(xiàn)強(qiáng)制關(guān)閉當(dāng)前程序進(jìn)程,本文直接給出實(shí)現(xiàn)代碼,可以實(shí)現(xiàn)完全Kill掉不留痕跡,需要的朋友可以參考下2015-06-06
C#控制臺(tái)程序中處理2個(gè)關(guān)閉事件的代碼實(shí)例
這篇文章主要介紹了C#控制臺(tái)程序中處理2個(gè)關(guān)閉事件的代碼實(shí)例,本文中的2個(gè)關(guān)閉事件是指Ctrl+C事件和窗口的關(guān)閉按鈕事件,需要的朋友可以參考下2014-09-09
C#實(shí)現(xiàn)任意數(shù)據(jù)類型轉(zhuǎn)成json格式輸出
C#實(shí)現(xiàn)任意數(shù)據(jù)類型轉(zhuǎn)成json格式輸出。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10

