第13講 3次魔方陣の自動生成
第4話 魔方陣になるための2つの条件
さて、上のコンソール画面を見て、
魔方陣とは何であったか思い出しましょう。
方陣であって、行・列・対角線の合計がすべて同じである、というのが魔方陣でした。
実はもう一つ重要なルールがあります。
例えば、
2 | 8 | 5 |
9 | 5 | 1 |
4 | 2 | 9 |
は魔方陣といえますか。
確かに、行・列・対角線の合計がすべて15になっています。
でも、違いますよね。
何が問題ですか。
数字の重複と漏れです。
魔方陣になるためには、
1から9までの数字が漏れなく重複なく入っていなければならないのです。
漏れなく重複なしと言いましたが、
漏れなくの条件
あるいは
重複なしの条件
の片一方で実は十分です。
一方を満たせば、必ず他方は満たされるからです。
残念ながら
2 | 8 | 5 |
9 | 5 | 1 |
4 | 2 | 9 |
は数字の重複があります。
したがって、魔方陣の2つの条件とは、
① 数字の重複がない
② 行・列・対角線の合計がすべて同じである
ということになります。
#include<iostream>
using namespace std;
void f(int **a);
int main(){
int i1,i2,i3,i4,i5,i6,i7,i8,i9;
int **a,cn;
cn=0;
a=(int **)malloc(12);
for(i1=0;i1<3;i1++)a[i1]=(int *)malloc(12);
for(i1=1;i1<10;i1++){
a[0][0]=i1;
for(i2=1;i2<10;i2++){
a[0][1]=i2;
if(a[0][1]!=a[0][0]){
for(i3=1;i3<10;i3++){
a[0][2]=i3;
if(a[0][2]!=a[0][0] && a[0][2]!=a[0][1] ){
if(a[0][0]+a[0][1]+a[0][2]==15){
for(i4=1;i4<10;i4++){
a[1][0]=i4;
if(a[1][0]!=a[0][0] && a[1][0]!=a[0][1] && a[1][0]!=a[0][2]){
for(i5=1;i5<10;i5++){
a[1][1]=i5;
if(a[1][1]!=a[0][0] && a[1][1]!=a[0][1] && a[1][1]!=a[0][2]
&& a[1][1]!=a[1][0]){
for(i6=1;i6<10;i6++){
a[1][2]=i6;
if(a[1][2]!=a[0][0] && a[1][2]!=a[0][1] && a[1][2]!=a[0][2] && a[1][2]!=a[1][0] && a[1][2]!=a[1][1]){
if(a[1][0]+a[1][1]+a[1][2]==15){
for(i7=1;i7<10;i7++){
a[2][0]=i7;
if(a[2][0]!=a[0][0] && a[2][0]!=a[0][1] && a[2][0]!=a[0][2]
&& a[2][0]!=a[1][0] && a[2][0]!=a[1][1] && a[2][0]!=a[1][2]){
if(a[0][2]+a[1][1]+a[2][0]==15 && a[0][0]+a[1][0]+a[2][0]==15 ){
for(i8=1;i8<10;i8++){
a[2][1]=i8;
if(a[2][1]!=a[0][0] && a[2][1]!=a[0][1] && a[2][1]!=a[0][2]
&& a[2][1]!=a[1][0] && a[2][1]!=a[1][1] && a[2][1]!=a[1][2]
&& a[2][1]!=a[2][0]){
if(a[0][1]+a[1][1]+a[2][1]==15){
for(i9=1;i9<10;i9++){
a[2][2]=i9;
if(a[2][2]!=a[0][0] && a[2][2]!=a[0][1] && a[2][2]!=a[0][2] && a[2][2]!=a[1][0] && a[2][2]!=a[1][1] && a[2][2]!=a[1][2] && a[2][2]!=a[2][0] && a[2][2]!=a[2][1]){
if(a[2][0]+a[2][1]+a[2][2]==15 && a[0][2]+a[1][2]+a[2][2]==15 &&
a[0][0]+a[1][1]+a[2][2]==15 ){
f(a);
cn++;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
cout<<"3次魔方陣が"<<cn<<"個できました。"<<endl;
}
条件① 数字の重複がない
の関わるのが紺で
条件② ② 行・列・対角線の合計がすべて同じである
に関わるのがピンクです。
第3話へ 第5話へ
C言語講義第1部へ
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)