2013-03-14 2 views
0

내 Sudoku Generator를 실행할 때 스택 오버플로가 27 회 발생합니다.27 회 실행 후 StackOverflow

void start(int todel){ 
int number; 
for (int x=0; x<9; x++) { 
    for (int y=0; y<9; y++) { 

     number = GenN(x, y); 
     osudoku[x][y]=number; 
    } 
} 
replace(todel); 
output(); 
} 


int GenZ(int x, int y){ 
    int number; 
    bool duplication = true; 
    Randomize(); 
    number = Random(9)+1; 
    duplication = check(number,x,y); 
    if (duplication==true){ 
     return GenZ(x,y); 
    } 
    else if (duplication==false) { 
     return number; 
    } 
} 

나는이 코드로 뭔가 생각합니다.

758 431 629 
913 267 485 
642 985 317 
Stack Overflow 

그래서 내가 1/3 스도쿠를 얻을 : 이 같은 일을 생성합니다.

+0

사용 언어로 태그하십시오. – Dukeling

+0

스택 트레이스 제공 –

+0

뭔가에 'number'를 지정하면 안됩니까? 'zahl '은 어디서 오는거야? – Thilo

답변

2

backtracking을 솔루션에 추가해야합니다.

이 시나리오 고려 : (알고리즘의 어느 시점에서 발생할 수 있습니다)

1 2 3 | 4 5 6 | 7 8 9 
4 5 6 | 1 2 3 | ? _ _ 
... 

프로그램이 바로 ?에 맞는 값을 찾기 위해 계속 시도를하지만, 이러한 값은 존재하지 않는다.

대신, 프로그램이 더 값이 맞는 없다고보고, 그것이 결국에 7, 89을 넣어해야하는 경우 다음 다음도 작동하지 않습니다 3, 2, 1에 대해 다른 값을 시도 할 필요가 두 번째 블록은 다음과 같습니다.

1 2 3 | 4 5 6 | 7 8 9 
4 5 6 | 7 8 9 | ? _ _ 
... 

이 경우 성공적으로 계속할 수 있습니다.

그리고이 : 당신은 (위의 예에서와 같이) 맞지 않는 값을 받고 계속 수 있으므로

zahl = Random(9)+1; 

정말 작동하지 않습니다. 언제 되돌릴 지 알 수 없습니다. 9 가지 값 모두를 반복하는 것이 좋습니다. 9 가지 값 모두를 반복 한 후에는 값이 맞지 않아서 되돌아 가야한다는 것을 알게됩니다.

+0

+1. 모든 숫자를 반복해야합니다. 그렇지 않으면 모두를 생성하더라도 종료 기준이 없습니다 (숫자가 더 이상 맞지 않을 때). – Thilo

0

GenZ에서 중복 == true이면 동일한 x, y로 다시 호출하여 중복을 만듭니다. == true? 난 당신이 "수"를 수정 볼 수 없습니다, 그래서 그 스도쿠를 만들 수있는 가능한 방법이 있다면 내가 확실하지 오전 0

+1

"number"에 할당 된 것을 볼 수 없습니다. "zahl"에 임의의 숫자가 할당되었습니다. –

+0

오, 죄송합니다. – user2168703

0
if (duplication==true){ 
    return GenZ(x,y); 
} 

같은 값을 초기화있어에서 수 있습니다, 특히 때문에,이 걸릴 수 있습니다 짐승 - 강제 당신이 그것을 구현하는 방법에 상관없이,하지만 당신은 아마 재귀를 사용하지 않고 루프를 가지고 stackoverflow 오류를 없앨 수 있습니다.

while (duplication){ 
+0

나는 이것을 이미 시도했지만, 작동하지 않을 것이다. – user2168703