n×n board におけるナイト・ツアーの数えあげについて
数理パズルの一つにナイト・ツアー(https://en.wikipedia.org/wiki/Knight%27s_tour)
というものがあります。
nが6以下のときについてn×n board における directed open tour を
以下のコードで数時間かけて数えあげたのですが、
n = 6 のとき0通り(正しくは6637920通り)になるのはどうしてでしょうか?
#include <stdio.h>
int used = 0;
int search(int x, int y, int w, int h, int depth){
int cnt = 0;
// はみ出したり、一度通った場所に来てはダメ
if (x < 0 || w <= x || y < 0 || h <= y || (used & (1 << (x + y * w))) > 0) return 0;
if (depth == w * h) return 1;
used += 1 << (x + y * w);
cnt += search(x + 2, y - 1, w, h, depth + 1);
cnt += search(x + 2, y + 1, w, h, depth + 1);
cnt += search(x - 2, y - 1, w, h, depth + 1);
cnt += search(x - 2, y + 1, w, h, depth + 1);
cnt += search(x + 1, y - 2, w, h, depth + 1);
cnt += search(x + 1, y + 2, w, h, depth + 1);
cnt += search(x - 1, y - 2, w, h, depth + 1);
cnt += search(x - 1, y + 2, w, h, depth + 1);
used -= 1 << (x + y * w);
return cnt;
}
int main(void){
int w;
for (w = 1; w < 7; w++){
int total = 0;
int i;
// (i % w, i / w)を始点とする経路
for (i = 0; i < w * w; i++){
total += search(i % w, i / w, w, w, 1);
}
printf("%d\n", total);
}
return 0;
}
実行結果
1
0
0
0
1728
0