&&を使う方法。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