0

하노이 타워 문제에 대한 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를 사용하여 대상으로 이동합니다. 그러나, 내 코드에서 이것을 구현할 때 세분화 오류가 발생합니다. 누군가 제발 나를 도와 줄 수 있습니까?

+3

'이동 (1, 소스, free_peg [pointer--, free_peg, 포인터 ++ - - P number_of_disks을) : 여기에 알고리즘이 어떻게되는지입니다 개입하는 순서 지점. 따라서 컴파일러를 분석하지 않고 어떤 일이 발생하는지 확신 할 수는 없습니다. 하지만 당신이'free_peg'에 접근하려하고 있다고 생각합니다. –

+0

+1 @DanielFischer, 전달하기 전에 매개 변수 평가 순서가 언어에서 정의되지 않았습니다. 당신이 가진 유일한 보장은 실제 콜 이전에 * all *이 평가된다는 것입니다. – WhozCraig

+0

그래서 함수 호출에서 "포인터"의 값을 변경할 수 없습니까? – Josh

답변

3

나는 k-peg 일반 솔루션을 해결할 수있었습니다. 도움을 주셔서 감사합니다. `, 당신은하지 않고 두 번`pointer`을 정의되지 않은 동작 수정하고있다;

void move(int number_of_disks, int source, int dest, vector <int> free_peg) 
    { 
     int p, middle, g; 

     if (1 == number_of_disks) 
     { 
      moves++; 
      move_top_disk (source, dest); 
     } 

     else 
     { 
      moves++; 

      if(free_peg.size() >= 2) 
       p = number_of_disks/2; 
      else 
       p = number_of_disks - 1; 

      //Move top "p" disks from peg 1 to peg i 
      middle = free_peg.back(); 
      free_peg.pop_back(); 
      free_peg.push_back(dest); 
      move(p, source, middle,free_peg); 

      //Move "n - p " disks from peg 1 to another peg 
      free_peg.pop_back(); 
      move(number_of_disks - p, source, dest, free_peg); 

        //Move p from current peg to the final peg 
      free_peg.push_back(source); 
      move(p, middle, dest, free_peg); 
     } 
    } 
+0

죄송합니다. 결석을했습니다. 조시. 저는 여러분이 다시 돌아 왔을 때 이것을 다시 생각하기 시작했습니다. 아주 좋은 해결책, btw. Frame-Stewart의 깨끗한 암시. grats! – WhozCraig