アインシュタインの問題を解くプログラム – 1-9の数字の組合せは? –

 
 
の続き。
 
問題の図は、上の記事を参照してもらうとして、問題だけ再掲すると、
 
 
問題:
頭のAからIの□の中に1から9までの数字を1つづつ入れます。
7つの三角形の「3つの頂点に入る数の和」が全て等しくなるようにしてください。(図は一番下の画像)
 
 
ここんとこ外出続きで忙しかったけど、ひさびさに時間があるので、続きを書く。
 
でも・・あまり時間ないから、美しくするのは諦めた。。(;´・ω・)
ホントは、ループの部分(parameter関数)をなんとかしたいもんだが……orz
まあ、答えはちゃんと出るから良っか、ってことで(何
以前にも言ったように、24通りの答えがある。
1-9の数字で、各数字が1つずつ当てはまる・・
と言われれば、思い浮かぶのは1つ。
魔法陣。
まあ、魔法陣を使えば、手計算でも24通り出すのはある程度
楽かもしれない。しかしまあ、めんどいことに変わりはない。
というわけで、24通りすべての答えを出すプログラムです。
 
 
— Program Source Code —
 
 
#include <stdio.h>
/*プロトタイプ宣言*/
void parameter(int a[][9], int*);
int check(int*);
int check_para(int*, int);
 
/*      main関数        */
int main(void)
{
    int a[25][9], n, m = 0, temp ;          //各頂点の値を入れる
    parameter(a, &m);  
    temp = m;
    for(m=0 ; m < temp ;m++)
    {
        printf("%3d:", m+1);
        for(n = 0; n < 9 ; n++)
        {
            printf("%3c=%d", ‘A’+n, a[m][n]);
        }
        putchar(‘n’);
    }
    return 0;
}
 
/*ループしすぎ・・もうちょい巧く……したいなあorz*/
void parameter(int a[][9], int *m)
{
    int i[9], n;
    for(i[0] = 1 ; i[0] < 10 ; i[0]++)
        for(i[1] = 1 ; i[1] < 10 ; i[1]++)
            if(check_para(i, 1) == 1)
                for(i[2] = 1 ; i[2] <10 ; i[2]++)
                    if(check_para(i, 2) == 1)
                        for(i[3] = 1 ; i[3] <10 ; i[3]++)
                            if(check_para(i,3) == 1)
                                for(i[4] = 1 ; i[4] <10 ; i[4]++)
                                    if(check_para(i,4) == 1)
                                        for(i[5] = 1 ; i[5] <10 ; i[5]++)
                                            if(check_para(i, 5) == 1)
                                                for(i[6] = 1 ; i[6] <10 ; i[6]++)
                                                    if(check_para(i, 6) == 1)
                                                        for(i[7] = 1 ; i[7] <10 ; i[7]++)
                                                            if(check_para(i, 7) == 1)
                                                                for(i[8] = 1 ; i[8] <10 ; i[8]++)
                                                                    if(check_para(i,8) == 1)
                                                                        if(check(i) == 1)
                                                                        {
                                                                            for(n = 0; n < 9 ; n++)
                                                                                a[*m][n]=i[n];
                                                                            (*m)++;
                                                                        }
}
 
/*ちゃんと違う?*/
int check_para(int *i, int n)
{
    int x = n, count=0;
    for(x = x-1 ; x >= 0 ; x–)
        if(i[n] != i[x])
            count++;
    if(count == n)
        return 1;
    else
        return 0;
}
 
/*いけるかチェックー*/
int check(int *i)
{
    if(i[0]+i[2]+i[3] == i[0]+i[1]+i[6] &&
       i[1]+i[4]+i[5] == i[3]+i[4]+i[6] &&
       i[3]+i[5]+i[8] == i[6]+i[7]+i[8] &&
       i[2]+i[4]+i[7] == i[0]+i[2]+i[3] &&
       i[0]+i[1]+i[6] == i[1]+i[4]+i[5] &&
       i[1]+i[4]+i[5] == i[3]+i[5]+i[8])
        return 1;
    else
        return 0;
}
 
 
— END —
 
こんな感じで、82行。
 
[実行結果]
 
  1:  A=1  B=6  C=9  D=5  E=2  F=7  G=8  H=4  I=3
  2:  A=1  B=8  C=9  D=5  E=4  F=3  G=6  H=2  I=7
  3:  A=1  B=9  C=6  D=8  E=2  F=4  G=5  H=7  I=3
  4:  A=1  B=9  C=8  D=6  E=4  F=2  G=5  H=3  I=7
  5:  A=2  B=7  C=9  D=4  E=5  F=3  G=6  H=1  I=8
  6:  A=2  B=9  C=7  D=6  E=5  F=1  G=4  H=3  I=8
  7:  A=3  B=4  C=7  D=5  E=2  F=9  G=8  H=6  I=1
  8:  A=3  B=7  C=4  D=8  E=2  F=6  G=5  H=9  I=1
  9:  A=3  B=7  C=8  D=4  E=6  F=2  G=5  H=1  I=9
 10:  A=3  B=8  C=7  D=5  E=6  F=1  G=4  H=2  I=9
 11:  A=4  B=3  C=9  D=2  E=5  F=7  G=8  H=1  I=6
 12:  A=4  B=9  C=3  D=8  E=5  F=1  G=2  H=7  I=6
 13:  A=6  B=1  C=7  D=2  E=5  F=9  G=8  H=3  I=4
 14:  A=6  B=7  C=1  D=8  E=5  F=3  G=2  H=9  I=4
 15:  A=7  B=2  C=3  D=5  E=4  F=9  G=6  H=8  I=1
 16:  A=7  B=3  C=2  D=6  E=4  F=8  G=5  H=9  I=1
 17:  A=7  B=3  C=6  D=2  E=8  F=4  G=5  H=1  I=9
 18:  A=7  B=6  C=3  D=5  E=8  F=1  G=2  H=4  I=9
 19:  A=8  B=1  C=3  D=4  E=5  F=9  G=6  H=7  I=2
 20:  A=8  B=3  C=1  D=6  E=5  F=7  G=4  H=9  I=2
 21:  A=9  B=1  C=2  D=4  E=6  F=8  G=5  H=7  I=3
 22:  A=9  B=1  C=4  D=2  E=8  F=6  G=5  H=3  I=7
 23:  A=9  B=2  C=1  D=5  E=6  F=7  G=4  H=8  I=3
 24:  A=9  B=4  C=1  D=5  E=8  F=3  G=2  H=6  I=7
 
 

関連:

 
カテゴリー: 論考 パーマリンク