Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。おけるナイト・ツアーの数えあげについて)でナイトツアーの数えあげを行いました。おけるナイト・ツアーの数えあげを高速に行うにはどうすればよろしいでしょうか?以下のコードは、長方形の対称性を利用することで以前の計算の約1/4位になっています。票6+100盤面の対称性を利用する元質問での工夫にもある通り、縦横半分に4分割すると、それぞれ線対称・点対称の関係にありますので、各部分の解の数は同数になります。部分の各マスを始点とした解の数の合計を求めて4倍すると全体の解が求まります。辺の長さが奇数の場合は工夫が必要です。部分の計算に含めず、後から改めて求めるとよいです。部分について、各マスを始点とした解の数を求め、それを4倍する。各マスを始点とした解の数を求め、それを2倍する。横の数が奇数の場合も縦横を読み替えて同様にする。縦、横共に奇数の場合、これまでの手順で、中央の1マスが未計算になるので、中央のマスを始点とした解の数を求める。上記すべてを合計する。管理することで枝刈りを行えます。言い替えると、各マスをノードとし、ナイトが1回移動できるマス間を繋いだ双方向グラフの、ノードから延びる辺の数です。盤面の、まだどこにも訪問していない状態での数は以下のようになります。2|+--+--+--+--+--+今回考えついた、カウントを元にした枝刈りの方法は以下の通りです。解の探索のために、あるマスを訪問して、それによってそこから飛べるマスのカウントを減らします。その時の状態によって、以下のように枝刈りを行います。飛び先候補のマスで、カウントが0になったマスがあったら、それが最後の未訪問マスでなければ、その探索は失敗。次の飛び先として、カウントが0のマスを選んだら、それ以上移動できなくなります。いって、他のマスを優先すると、カウント0のマスに入ることができなくなります。そのため、カウントが0となった場合、それが最後の未訪問マスでなければ失敗となります。盤面全体で、カウントが1のマスが3つ以上あったら、その探索は失敗。カウント1のマスとは、そこに飛び込んだら、もうそれ以上移動できなくなるマスのことです。そこを最後の訪問先としなくてはなりません。それだけなら、3つ以上ではなく、2つ以上の時点で失敗ですが、現在の訪問先からカウント1のマスに飛んだ場合はまだ移動できるので詰みません。3つの場合は、現在の訪問先からそのうちひとつに飛べたとしても、残りふたつを同時に最後にすることはできないため詰みます。カウントが1のマスが2つの場合、次の飛び先は必ずカウント1のマスのみとする。ひとつ前の枝刈りでも説明した通り、カウント1のマスが2つ存在した時点で探索失敗となりますが、現在の訪問先からカウント1のマスに飛べばまだ目があります。逆に言うと、カウント1以外のマスに飛んでしまうと、ふたつのマスを同時に最後にする必要が出てきてしまうので解がなくなります。コード以上の工夫を取り入れたプログラムを書いてみました。無闇に煩雑で長々としているのは私のセンスのなさゆえですが大目に見て下さい。//そのマスから/マスへ移動可能なマスがいくつあるか。//解の探索で、利き筋のマスが訪問済になると減少する。カウントが1のマスの数。そのすべてを訪問することはできないため解なしとなる。マスの位置を表す構造体。