国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#解決漢諾塔問題DEMO

2020-01-24 01:49:24
字體:
來源:轉載
供稿:網友

漢諾塔問題是學習遞歸的入門問題,這里用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();    }        }}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广东省| 澄迈县| 夏邑县| 石泉县| 五大连池市| 深圳市| 木兰县| 顺义区| 岗巴县| 达州市| 漳州市| 温泉县| 达日县| 平湖市| 浮梁县| 华亭县| 普安县| 双江| 闵行区| 渭源县| 方城县| 伊川县| 陆良县| 清河县| 普定县| 饶河县| 锡林浩特市| 台湾省| 靖边县| 高淳县| 贞丰县| 芮城县| 英德市| 厦门市| 阿拉善左旗| 繁昌县| 斗六市| 枞阳县| 天台县| 连城县| 平罗县|