プログラムの実行結果は以下の通り。
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; }