コマ大の問題をプログラムで解こう第3問目 – アインシュタイン問題 7つの三角形の3頂点の和が等しくなるのは? –

 
問題:
頭のAからIの□の中に1から9までの数字を1つづつ入れます。
7つの三角形の「3つの頂点に入る数の和」が全て等しくなるようにしてください。(図は一番下の画像)
 
これは、数学って言うよりは、論理問題かな。
 
 
– 考え方(まずは手計算で)
 
とりあえず、順をおって考えてみよう。
まず、7つの三角形を列挙してみる。
 
1.A+C+D
2.A+B+G
3.E+B+F
4.E+G+D
5.E+C+H
6.G+I+H
7.F+I+D
ここで、まったく別の要素をとる3つの三角形
 
1.A+C+D
3.B+E+F
6.G+H+I
に着目。
 
1-9の数字をすべて合計すると、
 
  ((1+9)*9)/2=45
 
であるから、各三角形の頂点の和は、
 
     45 ÷ 3 = 15
 
であることが分かる。
(A+C+D = B+E+F = G+H+I かつA+C+D + B+E+F + G+H+I = 45だから)
その組合せは、
(1,5,9)(1,6,8)(2,4,9)(2,5,8)
(2,6,7)(3,4,8)(3,5,7)(4,5,6)の8通り。
 
いま、要素がすべて違う組合せは、
(1,5,9)(2,6,7)(3,4,8) - (Ⅰ)

(1,6,8)(2,4,9)(3,5,7) - (Ⅱ)
であることが分かるから、
1.A+C+D
3.B+E+F
6.G+H+I
2.A+B+G
5.C+E+H
7.D+F+I
には、(Ⅰ), (Ⅱ)それぞれの組合せが当てはまる。
いまは、上の集団に(Ⅰ)を、下の集団の組合せは(Ⅱ)であると仮定して解いていく。
残りの
4.D+E+G
(2,5,8)
(4,5,6)
を考えていこう。
まず、
(D, E, G) = (2, 5, 8)
としてみよう。
すると、(A,C) = (6, 7) or (7, 6)であるが、
A=7の場合、A+B+G = 7+0+8となってしまい不適当。
A=6の場合、B=1となる。このとき、F=9となる。
後は順に当てはめて行けば、
(A,B,C,D,E,F,G,H,I)=(6,1,7,2,5,9,8,3,4)
と求まる。
まあ、これはあくまで1つの解答で、全部で、
左右、上下の入れ替えで3通り。回転で4通り。鏡像で2通りあるから、
全部で24通りあるうちの1通りに過ぎない。
 
– プログラムで解いてみる
上のことを活かしたら、もっと効率的な処理をするプログラムを書けるんだろうけど、
それじゃプログラム組む意味がないってことで、問題に対してまったく取り組めない、
解き方が分からない状態で、以下に解くか、って感じのプログラムを組んでみた。
言ってみれば、総当たりプログラムww(めっちゃ非効率)
で、どうせプログラム組んで解くんなら、
すべての組合せを出したいところだが……ごめん時間なかった(;´・ω・)
とりあえず、未完成なやつを載せる。(いろんな意味で未完全)
明日、明後日、明々後日と忙しいからできるか分からないけど、
近日中に完全バージョンを載せたいな。。
 
 
—Program Source Code—
 
/*******************************************
Einstein’s_game_ver1.c (incomplete)
  A+C+D
= A+B+G
= B+E+F
= D+E+G
= C+E+H
= G+H+I
= D+F+I
 
********************************************/
 
#include <stdio.h>
/*プロトタイプ宣言*/
int parameter(int*);
int check(int*);
int check_para(int*, int);
 
/*      main関数        */
int main(void)
{
    int i[9], n;            //各頂点の値を入れる
    if(parameter(i) == 1)
        for(n = 0; n < 9 ; n++)
            printf("i[%d]=%dn", n, i[n]);
    else
        puts("失敗");
    return 0;
}
 
/*総当たりー*/
int parameter(int *i)
{
    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)
                                                                            return 1;
    return 0;
}
 
/*ちゃんと違う?*/
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—
 
[実行結果]
i[0]=1
i[1]=6
i[2]=9
i[3]=5
i[4]=2
i[5]=7
i[6]=8
i[7]=4
i[8]=3
 
いちおうこの答えは合ってるからねー(=^▽^=)
A-Iの値を1から回していったときに、一番最初に出る値がこれ。
 
 
(追記  07/03/10 20:00)
 
ごめん、、問題の図をアップするのを忘れていた。
 
カテゴリー: 論考 パーマリンク

コマ大の問題をプログラムで解こう第3問目 – アインシュタイン問題 7つの三角形の3頂点の和が等しくなるのは? – への1件のフィードバック

  1. ピンバック: 雑 | 粉末@それは風のように (日記)

コメントは受け付けていません。