   
      
      
      
       
      
       
       
      (1)ハノイの塔とは 
      
       
       
      ハノイの塔とは,重なった円盤を3本柱の間で移動する問題です。 
      ただし,より小さい円盤が必ず上にくるように重ねます。 
       
      たとえば,3枚の円盤の場合,以下のように, 
      一番左の柱(番号:1)に3枚の円盤があったとします。 
      これを一番右(番号:3)の柱に移します。 
       
        
       
      
       
      (2)3枚の場合の手順 
      
       
       
      たとえば,3枚の場合,次のような手順で1番の柱から3番の柱に移動することができます。 
       
        
        
       
       
        
        
       
       
       
       
       
      ここで, 
       
       ■ (1)から(3)は,2枚の円盤を塔1から塔2に移動する手順, 
       ■ (4)は,最も大きい円盤を塔1から塔3に移動, 
       ■ (5)から(7)は,2枚の円盤を塔2から塔3に移動する手順 
       
      です。 
       
      
       
           
      
       
      (3)N枚の場合の手順 
      
      
       
       
      3枚の場合を一般化することを試みましょう。 
      移動前の塔をA,移動先の塔をB,残りの塔をCとすると, 
       
       ■ AからCにN−1枚を移動 
       ■ AからBに1枚を移動 
       ■ CからBにN−1枚を移動 
       
      とすることができます。
  
        
        
         
       
       
      A,Bの組合せに対するCは,次の表の通りとなります。 
       
      
      
        
          
            | A | 
            B | 
            C | 
            A+B+C | 
           
          
            | 1 | 
            2 | 
            3 | 
            6 | 
           
          
            | 1 | 
            3 | 
            2 | 
            6 | 
           
          
            | 2 | 
            3 | 
            1 | 
            6 | 
           
          
            | 2 | 
            1 | 
            3 | 
            6 | 
           
          
            | 3 | 
            1 | 
            2 | 
            6 | 
           
          
            | 3 | 
            2 | 
            1 | 
            6 | 
           
        
       
      
       
       
       
       
       
       
       
       
       
       
       
       
      表に示すとおり, 
       
         A+B+C=6 
       
      の関係が成り立ちますから, 
       
        C = 6-(A+B) 
       
      とすることができます。 
      
       
           
      
      
       
      
      [プログラム例] 
        フォーム上に,textBox1,listBox1,button1を貼り付け, 
        枚数をtextBox1で指定して,button1をクリックしたら, 
        listBox1に手順が表示されるものとします。 
      
       
        private void MoveTo(int n,int x, int
      y) 
        { 
          string S=“第”+ n.ToString()
      + “盤を”
      + 
                x.ToString() +
      “軸から”
      + 
                 y.ToString() +
      "に移動"; 
          listBox1.Items.Add(S); 
        } 
        private void Hanoi(int n, int x,
      int
      y) 
        { 
           if(n>0)             //
      0 枚のときは何もしない 
           { 
              Hanoi(n-1,x, 6-x-y); //
      n - 1 枚を x → 中間的な塔 
              MoveTo(n,x,y);    
      //
      最も大きい円盤を x → y 
              Hanoi(n-1,6-x-y, y); //
      n - 1 枚を 中間的な塔 → y 
           } 
         }  
        private void button1_Click(object
      sender,
      System.EventArgs e) 
        { 
          listBox1.Items.Clear(); 
          int n = int.Parse(textBox1.Text); 
          Hanoi(n,1,3); 
        }  
      
      i
       
      
       
           
      
       
        1. 基本的なアルゴリズム 
       
        2. 基本的なデータ構造 
       
        3. 操作を伴うデータ構造 
       
        4. 探索 
       
        5. 再帰的アルゴリズム 
       
        6. ソート 
       
        7. 集合 
       
        8. 文字列処理 
       
        9. 色々なアルゴリズム 
       
        
      上のタイトルをクリックします 
       
       
      
      
       |