朝日新聞2004年10月2日パズルパーク解答

食材(M:肉,F:魚,V:野菜,B:豆)の組合せは以下の通り。

プログラムを作るとしたら以下のようになる。

#include "puzutl.h"

YesNo used[7];
int val[7] = {1,3,5,9,12,6,2};
cstring s[7] = { "(M,M)", "(M,F)", "(M,V)", "(M,B)", "(V,B)", "(F,V)", "(F,F)"};

int main( int argc, cstring argv[])
{
  int           cnt = 0;
  for( int a=0; a< 7; a++) {
    used[a] = YES;
    for( int b=0; b< 7; b++) {
      if( used[b]) continue;
      used[b] = YES;
      for( int c=0; c< 7; c++) {
        if( used[c]) continue;
        used[c] = YES;
        for( int d=0; d< 7; d++) {
          if( used[d]) continue;
          used[d] = YES;
          for( int e=0; e< 7; e++) {
            if( used[e]) continue;
            used[e] = YES;
            for( int f=0; f< 7; f++) {
              if( used[f]) continue;
              used[f] = YES;
              for( int g=0; g< 7; g++) {
                if( used[g]) continue;
                if( !((val[a] & val[b]) ||
                      (val[b] & val[c]) ||
                      (val[c] & val[d]) ||
                      (val[d] & val[e]) ||
                      (val[e] & val[f]) ||
                      (val[f] & val[g]))) {
                  ps( "%s, %s, %s, %s, %s, %s, %s\n", s[a], s[b], s[c], s[d], s[e], s[f], s[g]);
                }
                cnt++;
                used[g] = NO;
              }
              used[f] = NO;
            }
            used[e] = NO;
          }
          used[d] = NO;
        }
        used[c] = NO;
      }
      used[b] = NO;
    }
    used[a] = NO;
  }
  ps( "cnt:%d\n", cnt);
  return    0;
}

プログラムを実行すると以下の出力を得る。

(M,F), (V,B), (M,M), (F,V), (M,B), (F,F), (M,V)
(M,V), (F,F), (M,B), (F,V), (M,M), (V,B), (M,F)
cnt:5040