하노이 타워 문제에 대한 k-peg 솔루션을 해결하는 알고리즘 (논리)을 제안했지만 코드를 구현할 때 세그먼트 화가 발생했습니다. 결점.하노이 타워 [편집] - k 페그 솔루션
void move(int number_of_disks, int source, int dest, vector <int> free_peg, int pointer)
{
int p;
if (1 == number_of_disks)
{
moves++;
move_top_disk (source, dest);
}
if(free_peg.size() > 2)
p = number_of_disks/2;
else
p = number_of_disks - 1;
moves++;
//Move top "p" disks from peg 1 to peg i
move(p, source, free_peg.back(),free_peg, pointer);
//Move "n - p - 1" disks from peg 1 to another peg
move(number_of_disks - p - 1, source, free_peg[pointer--], free_peg, pointer++);
//Move the "last disk" from the source peg to the destination
move_top_disk(source, dest);
//Move "n - p - 1" disks from peg (i - 1) to the final peg
move(number_of_disks - p - 1, free_peg[pointer--], dest, free_peg, pointer++);
//Move "p" disks from peg i to the destination
move(p, free_peg.back(), dest, free_peg, pointer);
}
아이디어는 매우 간단합니다. 무료 페그 (또는 타워)의 벡터를 유지하고 전체 디스크를 이동할 때이를 업데이트합니다. 따라서 6 개의 페그와 n 개의 디스크의 경우 하나의 소스, 하나의 대상 및 4 개의 자유로운 페그가 있습니다. 아이디어는 소스에서 free_peg [3] (네 번째 free peg)까지 p ~ n/2를 (n - p)로 이동하는 것입니다. 이제는 벡터에 3 개의 자유 펙만 있습니다.이 3 개의 자유 펙을 사용하여 (n - p - 1) 개의 디스크를 free_peg [2]로 이동 한 다음 소스에서 대상으로 마지막 디스크를 이동합니다. 그래서 지금 나는 2 개의 자유로운 나무못과 1 개의 나무못 = 3 개의 자유 나무못을 가지고 있습니다. 다음으로, 3 개의 free pegs를 사용하여 (n-p-1) 디스크를 peg [2]에서 대상으로 이동해야합니다 (이제는 무료 인 소스 포함). 마지막으로 p 디스크를 free_peg [3]에서 4 개의 free peg를 사용하여 대상으로 이동합니다. 그러나, 내 코드에서 이것을 구현할 때 세분화 오류가 발생합니다. 누군가 제발 나를 도와 줄 수 있습니까?
'이동 (1, 소스, free_peg [pointer--, free_peg, 포인터 ++ - - P number_of_disks을) : 여기에 알고리즘이 어떻게되는지입니다 개입하는 순서 지점. 따라서 컴파일러를 분석하지 않고 어떤 일이 발생하는지 확신 할 수는 없습니다. 하지만 당신이'free_peg'에 접근하려하고 있다고 생각합니다. –
+1 @DanielFischer, 전달하기 전에 매개 변수 평가 순서가 언어에서 정의되지 않았습니다. 당신이 가진 유일한 보장은 실제 콜 이전에 * all *이 평가된다는 것입니다. – WhozCraig
그래서 함수 호출에서 "포인터"의 값을 변경할 수 없습니까? – Josh