&&を使う方法。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';
仮にAとして..
char tmp = 'A'; if (src=='A' || dst=='A') tmp='B'; if (src=='B' || dst=='B') tmp='C';
これは間違っています。
間違っていることを証明するには、ひとつでも例外を指摘すれば十分です。これを反例といいます。
反例:src='B' , dst='C' の時、tmp='C' となってしまう。
ちょっと見にくいですが、一番普通のやつを載せます。
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'; }
何回でできたか報告させる
あくまで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); } } }
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