朝日新聞2006年7月21日パズル横丁解答

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

Find: 初期状態 親:2匹, 子:8匹, 10週後: 親:618, 子:382, 総数:1000

プログラムのソースは以下の通り。

#include "puzutl.h"

void next_week( int parent0,    // 初期親の数
                int son0,       // 初期子供の数
                int parent,     // 現在の親の数
                int son,        // 現在の子供の数
                int egg,        // 卵の数
                int week)
{
  int total = parent + son + egg; // 親は死なず,卵が孵る
  if( total > 1000) return;     // 1000匹を超えたら題意を満たさない
  if( total == 1000) {
    ps( "Find: 初期状態 親:%d匹, 子:%d匹, %d週後: 親:%d, 子:%d, 総数:%d\n", parent0, son0, week, parent+son, egg, total);
    return;
  }
  next_week( parent0, son0,
             parent+son,        // 子供が親になる
             egg,               // 卵が孵って子供になる
             parent+son,        // 親と親になった子供が卵を産む
             week+1);
}

int main( int argc, cstring argv[])
{
  int           parent, son;
  for( parent=0; parent<= 10; parent++) {
    son = 10 - parent;
    next_week( parent, son, parent, son, parent/*卵*/, 1/*週*/);
  }
  return    0;
}