朝日新聞2007年3月16日のパズル横丁問題

問題

以下のような正方形が3個と正方形と1辺の長さが同じ正三角形を半分にした直角三角形がn個ある。

三角形の数をなるべく少なくして,2つの図形を合わせて大きな正三角形を作る。

解答への道(ヒント)

うーん,こういう問題を鼻歌でも歌いながらサクッと解けると優秀なプログラマなんだろうけど…

何となく方針は立ったけど,コードが大変そうだし,うまく枝刈り出来ないと計算が爆発するので諦めて頭で考える。

一応大きさだけでもプログラムを作って求めてみる。

正方形の一辺の長さを2,小さい三角形の数をn,できあがった大きな正三角形の一辺の長さをとすると以下の計算式が成り立つ。

大きな正三角形の一辺はの何れかの組み合わせになる。よって,

この計算式が成立するa,b,cを0〜100の範囲で虱潰してみる。

#include "puzutl.h"
#include <math.h>

int main( int argc, cstring argv[])
{
  for( int a=0; a<= 100; a++) {
    for( int b=0; b<= 100; b++) {
      for( int c=0; c<= 100; c++) {
        int eq = 12*a*c + 6*b*c;
        if( eq == 48) {
          double x = 2*a + b + sqrt(3)*c;
          int y = 4*a*a + 4*a*b + b*b + 3*c*c;
          int n = y / 2;
          if( !(y&1)) {         // nは整数なので,yは偶数になる
            double menseki = 4*3 + sqrt(3)*n/2.;
            double h = sqrt(3)*x/2;
            ps( "a:%d, b:%d, c:%d, n:%d 2*a+b:%d, menseki:%g, height:%g\n", a, b, c, n, 2*a+b, menseki, h);
          }
        }
      }
    }
  }
  return    0;
}

プログラムの実行結果は以下の通り。

a:0, b:2, c:4, n:26 2*a+b:2, menseki:34.5167, height:7.73205
a:0, b:4, c:2, n:14 2*a+b:4, menseki:24.1244, height:6.4641
a:1, b:0, c:4, n:26 2*a+b:2, menseki:34.5167, height:7.73205
a:1, b:2, c:2, n:14 2*a+b:4, menseki:24.1244, height:6.4641
a:2, b:0, c:2, n:14 2*a+b:4, menseki:24.1244, height:6.4641

この組み合わせを頭で考えてみる。

最初に頭で「こういう問題ってこういう組み合わせがあるんだよなー」ってのをすっかり忘れて考えていたら随分悩んでしまった。

(2007.3.17)プログラムを作って解くなら三角形の外壁から上記組み合わせで攻めていくのが良いのかなーと思って考えていたら,もう一つ答えが見つかった。三角形の置き方は沢山出てきてしまうが,四角形の置き方は2通りある。やっぱりプログラムは難しそうなので諦めた。

(2007.3.26)正解を間違えてました。指摘されて気づきました。最近赤字で訂正文ばかり書いている。何か恥ずかしいなー。答えは多分一通り。

 

量子コンピュータの話が新聞に出てたけど,実用化したらこういう問題がサクッと解けるのかな。
(2007.3.17)見たのは新聞でなく,日経エレクトロニクスの3/12号だった。