朝日新聞2005年7月15日パズル横丁解答

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

ア ア ア ア ア ア ア ア ア ア ア ア ア ア ア ア ア ア ア ア ア ア ア ア ア ア ア ア ア ア ア 

なんだよ,結局全部同じ文字ってか。

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

#include "puzutl.h"

int a[31] = {0};
#define M (31-1)
#define N (17-1)

void decide( int idx, int val)
{
  if( idx < 0 || idx >= 31) {
    pe( "ERROR\n");
    return;
  }
  if( a[idx]) return;           // 既に決定済みなので無視
  a[idx] = val;
  if( idx >= 0 && idx < 17) {
    decide( N-idx, val);        // 左側17文字が回文
  }
  else {
    decide( M-(idx-17), val);   // 右側14文字が回文
  }
  decide( M-idx, val);          // 全体が回文
}

int main( int argc, cstring argv[])
{
  int           n = 0;          // 割り当て文字
  for( int i=0; i< 31; i++) {
    if( !a[i]) decide( i, ++n); // 文字が決まっていなければ「ア」から割り当て
  }
  for( i=0; i< 31; i++) {
    ps( "%-.2s ", "・アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン"+a[i]*2);
  }
  return    0;
}