C의 Codeblocks 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;
}
재귀 호출을 디버그하는 것은 어렵지만 아직 수행해야합니다. 디버거를 사용하여 코드를 한 줄씩 단계별로 따라 가면서 재귀 호출을 수행하십시오. 또 다른 좋은 기술은 [고무 오리에 코드를 설명] (https://en.wikipedia.org/wiki/Rubber_duck_debugging)입니다. –
나이트 투어는 무거운 과정입니다. 당신은 전술이 필요합니다. 그것은 8 x 8보다 5 x 5 이전에 테스트 된 것 같습니다. – BLUEPIXY
전역 변수'i'의 사용은 어색해 보입니다. 계속 증가 시키지만 감소 시키지는 마십시오. 제 3의 인자로서'i'를 건네주고'next (..., i + 1)'와 같이 호출하는 것이 좋습니다. 그래서 각각의 재귀 레벨은'i'의 모호하지 않은 복사본을 갖습니다. –