第9講 配列とfor文を利用して3次魔方陣を作ろう
第5話 2次順列方陣の生成プログラムの解説
1 | 2 |
1 | |
3 | 4 |
となります。ここは重複チェックが必要でなく、
2番目のセル(2番目のループに進みます。)
for(j=1;j<5;j++){
a[0][1]=j;
の最初のループによって
1 | 2 |
1 | 1 |
3 | 4 |
となります。
ここは2番目のセルなので、重複検査が必要で
if(a[0][1]!=a[0][0]){
があるわけです。当然この検査を通り抜けることができませんので、
if(a[0][1]!=a[0][0]){
for(k=1;k<5;k++){
a[1][0]=k;
if(a[1][0]!=a[0][0] && a[1][0]!=a[0][1]){
for(l=1;l<5;l++){
a[1][1]=l;
if(a[1][1]!=a[0][0] && a[1][1]!=a[0][1] && a[1][1]!=a[1][0]){
System.out.print(a[0][0]);
System.out.print (" ");
System.out.print(a[0][1]);
System.out.println();
System.out.print(a[1][0]);
System.out.print (" ");
System.out.print(a[1][1]);
System.out.println();
System.out.println();
}
}
}
}
}
は実行されず、次のループになり、
1 | 2 |
1 | 2 |
3 | 4 |
となります。これは重複チェック
if(a[0][1]!=a[0][0]){
をクリアして
for(k=1;k<5;k++){
a[1][0]=k;
if(a[1][0]!=a[0][0] && a[1][0]!=a[0][1]){
for(l=1;l<5;l++){
a[1][1]=l;
if(a[1][1]!=a[0][0] && a[1][1]!=a[0][1] && a[1][1]!=a[1][0]){
System.out.print(a[0][0]);
System.out.print (" ");
System.out.print(a[0][1]);
System.out.println();
System.out.print(a[1][0]);
System.out.print (" ");
System.out.print(a[1][1]);
System.out.println();
System.out.println();
}
}
}
}
の1番目のループが実行されまして、
1 | 2 |
1 | 2 |
3 | 4 |
1 |
となる訳ですが、これは重複検査
if(a[1][0]!=a[0][0] && a[1][0]!=a[0][1]){
をパスせず、次のループとなり
1 | 2 |
1 | 2 |
3 | 4 |
2 |
となりますが、これも重複試験によってはねられ
1 | 2 |
1 | 2 |
3 | 4 |
3 |
でようやく検査を通り抜け
for(l=1;l<5;l++){
a[1][1]=l;
if(a[1][1]!=a[0][0] && a[1][1]!=a[0][1] && a[1][1]!=a[1][0]){
System.out.print(a[0][0]);
System.out.print (" ");
System.out.print(a[0][1]);
System.out.println();
System.out.print(a[1][0]);
System.out.print (" ");
System.out.print(a[1][1]);
System.out.println();
System.out.println();
}
}
が実行されますが、最初の3回のループ
1 | 2 |
1 | 2 |
3 | 4 |
3 | 1 |
1 | 2 |
1 | 2 |
3 | 4 |
3 | 2 |
1 | 2 |
1 | 2 |
3 | 4 |
3 | 3 |
はいずれも重複チェック
if(a[1][1]!=a[0][0] && a[1][1]!=a[0][1] && a[1][1]!=a[1][0]){
に抵触してif文
if(a[1][1]!=a[0][0] && a[1][1]!=a[0][1] && a[1][1]!=a[1][0]){
System.out.print(a[0][0]);
System.out.print (" ");
System.out.print(a[0][1]);
System.out.println();
System.out.print(a[1][0]);
System.out.print (" ");
System.out.print(a[1][1]);
System.out.println();
System.out.println();
}
は実行されません。
4度目の正直で
1 | 2 |
1 | 2 |
3 | 4 |
3 | 4 |
はじめて重複試験
if(a[1][1]!=a[0][0] && a[1][1]!=a[0][1] &&
a[1][1]!=a[1][0]){
に合格して
if文
if(a[1][1]!=a[0][0] && a[1][1]!=a[0][1] && a[1][1]!=a[1][0]){
System.out.print(a[0][0]);
System.out.print (" ");
System.out.print(a[0][1]);
System.out.println();
System.out.print(a[1][0]);
System.out.print (" ");
System.out.print(a[1][1]);
System.out.println();
System.out.println();
}
が実行され、1個目の2次順列方陣がコマンドプロンプトに表示されます。
以下のトレースは是非ご自分行ってください。
さて、次の課題です。いよいよ3次順列方陣に挑戦しましょう。
(これはほんの1部です。362880通りもあるのですから。)