最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#解決漢諾塔問題DEMO

 更新時(shí)間:2015年05月23日 12:13:31   投稿:junjie  
這篇文章主要介紹了C#解決漢諾塔問題DEMO,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下

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

通過簡(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ū)別及用法

    這篇文章主要介紹了C# Lambda表達(dá)式select()和where()的區(qū)別及用法,select在linq中一般會(huì)用來提取最后篩選的元素集合,在lambda表達(dá)式中通常用where得到元素集合,需要的朋友可以參考下
    2023-07-07
  • C#非遞歸先序遍歷二叉樹實(shí)例

    C#非遞歸先序遍歷二叉樹實(shí)例

    這篇文章主要介紹了C#非遞歸先序遍歷二叉樹的實(shí)現(xiàn)方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • 基于C#實(shí)現(xiàn)任意格式JSON文本的HTTP交互抽象類

    基于C#實(shí)現(xiàn)任意格式JSON文本的HTTP交互抽象類

    為了實(shí)現(xiàn)一個(gè)支持任意格式JSON交互的抽象類,并且在整個(gè)過程中不需要對(duì)JSON格式數(shù)據(jù)進(jìn)行序列化和反序列化操作,可以使用C#中的HttpClient類來進(jìn)行HTTP請(qǐng)求和響應(yīng),本文給大家介紹了基于C#實(shí)現(xiàn)任意格式JSON文本的HTTP交互抽象類,需要的朋友可以參考下
    2025-03-03
  • C#開發(fā)Windows UWP系列之3D變換

    C#開發(fā)Windows UWP系列之3D變換

    這篇文章介紹了C#開發(fā)Windows UWP系列之3D變換,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • c# 引用類型和值類型

    c# 引用類型和值類型

    CLR支持兩種類型:引用類型和值類型。引用類型總是從托管堆上分配的
    2012-10-10
  • Unity shader實(shí)現(xiàn)消融效果

    Unity shader實(shí)現(xiàn)消融效果

    這篇文章主要為大家詳細(xì)介紹了Unity shader實(shí)現(xiàn)消融效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C#實(shí)現(xiàn)強(qiáng)制關(guān)閉當(dāng)前程序進(jìn)程

    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í)例

    這篇文章主要介紹了C#控制臺(tái)程序中處理2個(gè)關(guān)閉事件的代碼實(shí)例,本文中的2個(gè)關(guān)閉事件是指Ctrl+C事件和窗口的關(guān)閉按鈕事件,需要的朋友可以參考下
    2014-09-09
  • C#利用后綴表達(dá)式解析計(jì)算字符串公式

    C#利用后綴表達(dá)式解析計(jì)算字符串公式

    當(dāng)我們拿到一個(gè)字符串比如:20+31*(100+1)的時(shí)候用口算就能算出結(jié)果為3151,因?yàn)檫@是中綴表達(dá)式對(duì)于人類的思維很簡(jiǎn)單,但是對(duì)于計(jì)算機(jī)就比較復(fù)雜了。相對(duì)的后綴表達(dá)式適合計(jì)算機(jī)進(jìn)行計(jì)算。本文就來用后綴表達(dá)式實(shí)現(xiàn)解析計(jì)算字符串公式,需要的可以參考一下
    2023-02-02
  • C#實(shí)現(xiàn)任意數(shù)據(jù)類型轉(zhuǎn)成json格式輸出

    C#實(shí)現(xiàn)任意數(shù)據(jù)類型轉(zhuǎn)成json格式輸出

    C#實(shí)現(xiàn)任意數(shù)據(jù)類型轉(zhuǎn)成json格式輸出。需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2013-10-10

最新評(píng)論

长乐市| 赣榆县| 金寨县| 桐庐县| 三原县| 宁武县| 禹城市| 凤凰县| 昭通市| 东海县| 甘谷县| 香港 | 邻水| 枝江市| 延寿县| 青岛市| 枣阳市| 尉氏县| 泰安市| 柳江县| 泰州市| 镇赉县| 乌拉特后旗| 墨脱县| 恩施市| 武宁县| 福安市| 德令哈市| 阜新| 谢通门县| 隆昌县| 石狮市| 贵德县| 应城市| 久治县| 盱眙县| 凉山| 祁门县| 渝中区| 凤阳县| 通山县|