朝日新聞2006年10月20日パズル横丁解答

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

Find
 0  1  2  3  4  5  6  7  8  9 10 11 12 
13 11  1 12 10  2  9  3  8  6  4  7  5 

これを図にすると以下の通り。

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

#include "puzutl.h"

int visit[13];                  // 訪問しているか?履歴表示用にYesNoでなく,訪問時の歩数を設定

void find( int level, int pos)
{
  if( pos < 0 || pos > 12) return; // 右か左に行き過ぎ
  if( pos == 0) {               // Goal?
    // 他の地点を一度ずつ訪問しているか?
    for( int i=1; i< 13; i++) {
      if( !visit[i]) {
        return;
      }
    }
    ps( "Find\n");
    for( i=0; i< 13; i++) {
      ps( "%2d ", i);
    }
    ps( "\n");
    ps( "%2d ", level);
    for( i=1; i< 13; i++) {
      ps( "%2d ", visit[i]);
    }
    ps( "\n");
    return;
  }
  if( visit[pos]) return;       // 既に訪問済み
  if( level == 8) {             // 8回目のジャンプ
    if( pos != 8) return;       // 8個目の石ではない
  }
  visit[pos]    = level;
  find( level+1, pos+2);        // 右に2歩
  find( level+1, pos+3);        // 右に3歩
  find( level+1, pos-2);        // 左に2歩
  find( level+1, pos-3);        // 左に3歩
  visit[pos]    = 0;
}

int main( int argc, cstring argv[])
{
  find( 1, 2);
  find( 1, 3);
  return    0;
}