2011-10-24 2 views
1

저레벨 코스에서 과제로 재귀를 다루는 것은 처음입니다. 나는 인터넷 주위를 둘러 보았고 내가 가진 것과 비슷한 방법을 사용하는 사람을 찾을 수없는 것 같다. (아마도 이것이 왜 작동하지 않는지에 대해 말하고있을 것이다.) 이 오류는 std::__copy_move...에있는 세그멘테이션 오류입니다. 저는 이것을 C++ STL에있는 것으로 가정합니다. 나는 잠시 동안이 일을 주위에 내 머리를 정리하려고 봤는데 내가 잘못 무슨 일이 일어나고 있는지 알아낼 수 없습니다재귀 역 추적 스도쿠 해 찾기 문제, C++

bool sudoku::valid(int x, int y, int value) 
{ 
    if (x < 0) {cerr << "No valid values exist./n";} 

    if (binary_search(row(x).begin(), row(x).end(), value)) 
     {return false;}     //if found in row x, exit, otherwise: 
    else if (binary_search(col(y).begin(), col(y).end(), value)) 
     {return false;}     //if found in col y, exit, otherwise: 
    else if (binary_search(box((x/3), (y/3)).begin(), box((x/3), (y/3)).end(), value)) 
     {return false;}     //if found in box x,y, exit, otherwise: 
    else 
     {return true;}     //the value is valid at this index 
} 

int sudoku::setval(int x, int y, int val) 
{ 
    if (y < 0 && x > 0) {x--; y = 9;} //if y gets decremented past 0 go to previous row. 
    if (y > 8) {y %= 9; x++;}   //if y get incremented past 8 go to next row. 

    if (x == 9) {return 0;}    //base case, puzzle done. 
    else { 
     if (valid(x,y,val)){   //if the input is valid 
      matrix[x][y] = val;   //set the element equal to val 
      setval(x,y++,val);   //go to next element 
     } 
     else { 
      setval(x,y,val++);   //otherwise increment val 
      if(val > 9) {val = value(x,y--); setval(x,y--,val++); } 
     }        //if val gets above 9, set val to prev element, 
    }         //and increment the last element until valid and start over 
} 

다음과 같이 됐건, 내 코드입니다. 모든 제안 사항을 높이 평가합니다! :)

+0

'매트릭스'란 무엇입니까? 이와 같은 세부 정보가 없으면 코드를 디버그하기가 어렵습니다. – Flexo

+1

나는 당신이 알고리즘 디자인을 재검토해야한다고 생각한다. 당신의 재귀의'if' 부분에서'else' 부분에 재귀 적으로 유효성을 검사합니다. 유효성 검사를하지 않습니다. 또한, 재귀 후에 만 ​​val> 9를 체크한다. – arne

+0

은 setval이하는 것을 작성함으로써 시작됩니다. (valid, x, y, val) setval은 다른 (x, y) paires에서 val을 반복해서 지정하려고 시도하지만 어떤 (x, y)와도 유효하지 않은 경우 어떻게됩니까? – lkanab

답변

0

다음은 UNIX가 아닌 Windows 용입니다.

std::__copy_move...은 STL 괜찮습니다. 그러나 STL은 그 자체로 아무 것도하지 않습니다. 코드에서 함수 호출을하면 잘못된 인수 나 잘못된 상태로 호출 할 수 있습니다. 그걸 알아 내야 해.

오류가 발생한 코어 덤프가있는 경우 pstack <core file name>을 수행하면 충돌의 전체 호출 스택이 표시됩니다. 그런 다음 코드의 어느 부분이 포함되어 있는지 확인하고 거기에서 디버깅을 시작합니다 (추적/couts/... 추가).

보통이 코어 파일은 읽기 쉬운 이름으로 제공되지만, 그렇지 않은 경우 nm 또는 c++filt 등을 dismangle에 사용할 수 있습니다.

마지막으로, pstack 당신은 항상 당신의 IDE에 내장 gdb, Sun Studio 또는 디버거와 같은 디버거 이진 (핵심 생산 된) 코어 파일을로드하고 함께 같은 일을 볼 수 있습니다, 단지 작은 cmd를 줄 유틸리티입니다 다른 많은 정보와 옵션이 있습니다.

1

sudoku::setval

HTH는 int을 반환하기로되어 있지만, 전혀 아무 것도 반환하지 않습니다 적어도 두 가지 경로가있다한다. 다른 경로에서 반환해야하는 것을 알아 내야합니다. 그렇지 않으면 무작위로 정의되지 않은 동작이 발생하게 될 것이기 때문입니다.

1

더 이상의 정보가 없으면 알 수 없습니다. 데이터가 과 관련되어 있으며, 예를 들어 rowcol이 반환합니다. 아직도 분명 문제가 있습니다 : sudoku::valid에서

  • , 당신은 분명히 오류 조건 (x < 0)이 무엇인지를 확인하지만 당신은 반환하지 않습니다 x의 음수 값을 사용하여 테스트를 계속합니다. sudoku:valid에서 또한

  • : row 할 및 col 정말 분류 값에 대한 참조를 반환? 값이 정렬되지 않으면 binary_search은 에 정의되지 않은 동작을 나타냅니다. 그렇다면 이름이 다소 입니다. 그리고 그들은 같은 객체에 대한 참조보다 값을 반환하면 begin()end() 함수는 다른 객체 —을 다시 참조하고 정의되지 않은 동작을 다시 참조합니다.

  • 마지막으로 알고리즘에서 역 추적이 표시되지 않으며 해결책으로 진행되는 방법을 확인하지 않습니다.

FWIW는 : I가 비슷한 썼을 때, I 보드 81 개 요소 간단한 배열을 사용하고 적절한 행, 열 및 박스에 인덱스 (0 – 80) 매핑 정적 배열을 만들어 . 9 행, 열 및 상자 각각에 대해 사용 된 값 집합 ( 비트 맵)을 유지했습니다. 이것은 합법성을 매우 사소한 것으로 보았습니다. 그리고 그것은 색인을 증가시킴으로써 테스트 할 다음 사각형으로 증가 할 수 있음을 의미했습니다. 결과 코드는 매우 간단합니다. 독립적으로, 당신이 필요합니다 사용되는 데이터 표현의

: 일부 "글로벌"( sudoku의 아마 회원)는 이 솔루션 여부를 발견했는지 아는 수단; 광장 (용액이 인 경우 중지) 및 재귀에 대해 가능한 값을 각각 시도하는 어프로치. 보드에 간단한 배열을 사용하고 있지 않다면, 내가 한 번 증분을 처리하는 함수를 사용하여 클래스의 클래스 또는 구조체를 제안 할 것입니다.

0

함수를 반복적으로 여러 번 입력하면 세그먼테이션 오류가 발생할 수 있습니다. 나는 그것에 이르는 하나의 시나리오를 언급했다. 그러나 나는 거기에 더 확신합니다.

팁 : 단어의 모든 기능의 목적을 쓰기 -이 쓰기에 너무 복잡 경우 - 함수가 아마 분할해야 ...

0

당신의 알고리즘이 조금 "짐승 forcy"처럼 보인다. 이것은 일반적으로 구속 만족 문제 (Constraint Satisfaction Problems, CSP)와는 좋은 전술이 아닙니다. 나는 해결사 잠시 뒤 (내가 github에 발견하기 전에 그것이, 난 여전히 소스 코드 있었으면 좋겠다) 스도쿠를 쓴 내가 찾을 수있는 가장 빠른 알고리즘은 소둔을 시뮬레이션했다 :

http://en.wikipedia.org/wiki/Simulated_annealing

그것은 확률 적이다, 그러나 이 문제 IIRC에 대한 다른 방법보다 일반적으로 더 빠른 속도를 보였다.

HTH!