私は再帰とバックトラックを使用してナイト・ツアーの問題を解決しようとすると、CでコードブロックIDEに次のコードを使用しています。しかし、無限回帰のケースではないと思うけど、それは永遠に続き、出力を出さないということです。「ナイトツアー」のコードが正しく動作しないのはなぜですか?
#include <stdio.h>
#include <conio.h>
int board[8][8]= {{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0}};
int i = 1;
int next(int a, int b);
int main()
{
int j, k;
next(0,0);
for(k = 0; k < 64; k++)
{
printf(" %d ", board[k/8][k%8]);
if((i+1)%8==0)
printf("\n");
}
}
int next(int a, int b)
{
if(i==64)
{
board[a][b]=64;
return 1;
}
if((a<0||a>7||b<0||b>7))
return 0;
if(board[a][b]!=0)
return 0;
printf(" %d %d ", a, b);
//getch();
board[a][b]= i;
if(next(a+2, b+1))
{
i++;
return 1;
}
if(next(a+1, b+2))
{
i++;
return 1;
}
if(next(a-1, b+2))
{
i++;
return 1;
}
if(next(a+2, b-1))
{
i++;
return 1;
}
if(next(a-2, b-1))
{
i++;
return 1;
}
if(next(a-1, b-2))
{
i++;
return 1;
}
if(next(a+1, b-2))
{
i++;
return 1;
}
if(next(a-2, b+1))
{
i++;
return 1;
}
board[a][b]=0;
return 0;
}
を、再帰呼び出しをデバッグするのは難しいですが、それはまだ行われる必要です。デバッガを使用して、コードを1行ずつステップ実行し、再帰呼び出しを実行します。別の良いテクニックは[あなたのゴム製の鴨にコードを説明する](https://en.wikipedia.org/wiki/Rubber_duck_debugging)です。 –
騎士のツアーは大変な作業です。あなたは5×5の前に8×8 – BLUEPIXY
魚に見えるi'グローバル変数 'の使用でテストしているようで、戦術を必要とします。あなたはそれを絶えず増やしますが、決して減らしません。第3引数として 'i'を渡し、' next(...、i + 1) 'のように呼び出すことで、各再帰レベルに' i'の曖昧さのないコピーを持たせることができます。 –