나는 역 추적에서 나이트의 여행 문제를 해결하기 위해 SML 코드를 작성해야합니다. 체스 판은 체스 판 (크기 : NxN
) 전체를 달려야하며 각 사각형을 정확히 한 번 방문해야합니다 (끝에 첫 번째 사각형으로 돌아올 필요 없음).smlnj의 열린 기사단 (백 트랙킹) 알고리즘
나는 빈 보드를 만들고, 보드에 사각형을 얻고, 다음 기사의 가능한 기사 목록을 얻는 모든 기능을 이미 작성했습니다. 하지만 SML에서 재귀 함수를 작성하는 방법에 대해서는 잘 모르겠다. (나는이 알고리즘을 C로 작성하는 법을 알고 있지만 SML에서는 작성하지 않았다.)
dl and dr are array : (delta to calculate next moves)
dl = [-2,-2, -1, 1, 2, 2, 1, -1]
dr = [-1, 1, 2, 2, 1, -1,-2, -2]
bool backtracking(int** board, int k/*current step*/, int line, int row, int* dl, int* dr)
{
bool success = false;
int way = 0;
do{
way++;
int new_line = line + dl[way];
int new_row = row + dr[way];
if(legal_move(board, new_line, new_row))
{
setBoard(board,new_line, new_row,k); //write the current step number k in board
if(k<64)
{
success = backtracking(board, k+1, new_line, new_row, dl, dc);
if(!success)
{
setBoard(board,new_line, new_row,0);
}
}
else
success = true;
}
}
while(!(success || way = 8));
return success;
}
C로 쓰는 방법을 알고 있다면 C를 쓰거나 붙이면 SML로 변환하는 데 도움이됩니다. –
웹 사이트 제한으로 인해 내 질문을 편집했습니다 ... (내 질문에 24 시간 이내에 답변 할 수없고 댓글이 너무 큽니다.) – Arie
글을 적어 둘 장소입니다. 게시해서는 안됩니다. 답으로 질문에 대한 업데이트, 주석에는 큰 코드 블록을 포함 할 수 없습니다. –