ハノイの塔4(staticでないやり方)

ファイル名 Hanoi3.java の部品

&&を使う方法。srcとdstの組み合わせは6種類ある。全部を書き出して、それぞれtmpを設定する。

'X'は、どれにも該当しない時をjavaが心配してエラーを出すのでその対策

      char tmp = 'X';
      if (src=='A' && dst=='B') tmp='C';
      if (src=='B' && dst=='A') tmp='C';
      if (src=='B' && dst=='C') tmp='A';
      if (src=='C' && dst=='B') tmp='A';
      if (src=='C' && dst=='A') tmp='B';
      if (src=='A' && dst=='C') tmp='B';

ファイル名 Hanoi3.java の部品 これは間違っています。

仮にAとして..

      char tmp = 'A';
      if (src=='A' || dst=='A') tmp='B';
      if (src=='B' || dst=='B') tmp='C';

これは間違っています。

間違っていることを証明するには、ひとつでも例外を指摘すれば十分です。これを反例といいます。

反例:src='B' , dst='C' の時、tmp='C' となってしまう。

ファイル名 Hanoi3.java の部品

ちょっと見にくいですが、一番普通のやつを載せます。

      char tmp;
      if (src=='A'){
         if (dst=='B') tmp='C'; else tmp='B';
      }
      else if (src=='B'){
         if (dst=='A') tmp='C'; else tmp='A';
      }
      else{
         if (dst=='B') tmp='A'; else tmp='B';
      }

数を数えよう

ファイル名 Hanoi32.java

何回でできたか報告させる

あくまでstatic

public class Hanoi32 { 
   static long ct=0; 
   public static void main( String[] args ) {
      idou(4,'A','C');
      System.out.println(ct);
   } 
   public static void idou(int n,char src,char dst){
       /*  ここに  src と dst に使っていない場所を
           tmp とするプログラムを書く              */
      if (n > 0){
         idou(n-1,src,tmp);
         System.out.println ( src + " から " + dst + " へ移動" );
         ct++;
         idou(n-1,tmp,dst);
      }
   } 
}

ファイル名 Hanoi33.java

staticでない使い方とは(都合上Hanoi33としましたが、Hanoi32の別解です。)

public class Hanoi33 { 
   long ct=0;
   public Hanoi33(int n,char src,char dst) { 
      idou(n,src,dst);
   }
   public void idou(int n,char src,char dst){
       /*  ここに  src と dst に使っていない場所を
           tmp とするプログラムを書く              */
      if (n > 0){
         idou(n-1,src,tmp);
         System.out.println ( src + " から " + dst + " へ移動" );
         ct++;
         idou(n-1,tmp,dst);
      }
   } 
   public static void main( String[] args ) {
      Hanoi33 hanoi = new Hanoi33(4,'A','C');
      System.out.println(hanoi.ct);
   } 
}

このようになります

A から B へ移動
A から C へ移動
B から C へ移動
A から B へ移動
C から A へ移動
C から B へ移動
A から B へ移動
A から C へ移動
B から C へ移動
B から A へ移動
C から A へ移動
B から C へ移動
A から B へ移動
A から C へ移動
B から C へ移動
15

別の表し方

このような表示にできますか。

A: 3 2 1
B:
C:

A: 3 2
B:
C: 1

A: 3
B: 2
C: 1

A: 3
B: 2 1
C:

A:
B: 2 1
C: 3

A: 1
B: 2
C: 3

A: 1
B:
C: 3 2

A:
B:
C: 3 2 1
もくじ

聖愛中学高等学校
http://www.seiai.ed.jp/
Last Modified