2011-04-14 5 views
2

학교 과제에서 우리는 soduko-solver를해야합니다. 나는 soduko-puzzles를 푸는 데 도움이되는 재귀 적 방법을 가지고있다. 그것은 다음과 같이 진행됩니다왜 스도쿠 - 솔버의 재귀 적 방법이 계속 회전합니까?

public void setNumber() { 

if (getNext() == null) { 

    for (int i = 1; i < 10; i++) { 
    if (acceptValue(i)) { 
     value = i; 
    } 
    } 
    board.stopRec(); 
    return; 

} else { 


    if(predefined()) { // if the square allready has a number 
    getNext().setNumber(); 
    } else { // find value for undefined square 

    for (int i = 1; i < 10; i++) { 
     if (acceptValue(i)) { 
     value = i // Does the Row class take notice of this? 
     getNext().setNumber(); 
     } 
    } 
    /* no value was assigned */ 
    value = -1; 

    } 

} 

} 

이사회 클래스는 모든 사각형을 생성하고 nextSquare 참조에게 행 클래스의

class Board { 

[...] 

public void initGrid(int nSquaresBoxRowCol, int nRowsBox, int nColsBox, int[][] values) { 

[...] 

/* Create the rows, columns and squares */ 
Square prev = null; 
for (int row = 1; row <= nRowsBoard; row++) { 

    //Row r = new Row(row, squares[row-1]); 
    Row r = new Row(row); 
    rows[row-1] = r; 

    for (int col = 1; col <= nColsBoard; col++) { 
    if (row == 1) { 
     Column c = new Column(col); 
    } 

    Square current = new Square(row, col, Math.ceil((float)row/(float)nRowsBox), Math.ceil((float)col/(float)nColsBox), values[row-1][col-1], r, this); 

    if (!((row-1) == 0 && (col-1) == 0)) { 
     prev.nextSquare = current; 
    } 

    prev = current; 
    squares[row-1][col-1] = current; 

    r.addSquare(current); 

    /* Fill the boxes with squares */ 
    boxes[(int)(Math.ceil((float)row/(float)nRowsBox)) - 1][(int)(Math.ceil((float)col/(float)nColsBox)) - 1].addSquare(squares[row-1][col-1]); 
    nSquares++; 

    } 

} // END for (int row ... 

객체를 사용하여 둘을 연결하는 방법 initGrid이, 희망 광장 개체를 보유하고있다 Board 클래스의 initGrid 메소드에 추가되었다.

class Row { 
int id; 

Square[] squares; 
ArrayList<Square> squareList; 

Row(int id) { 
this.id = id; // not currently used for anything 
squareList = new ArrayList<Square>(); 
} 

boolean checkValue(int val) { 
System.out.println("Checking values for row " + id);  
Iterator<Square> iter = squareList.iterator(); 
while(iter.hasNext()) { 
    System.out.println("Value (boolean checkValue() in Row): " + iter.next().value); 
    if (iter.next().value == val) { 
    System.out.println("returned false"); 
    return false; 
    } 
} 
return true; 

} 

public void addSquare(Square s) { 
squareList.add(s); 
System.out.println("class Row, method addSquare: Square with value " + s.value + " added to row."); 
} 

}있어서 클래스 스퀘어 내부 반 귀납법

정보


, 모든 사각형은 2 차원 배열로 조립된다. 이 방법은 스도쿠 보드의 모든 사각형에 대해 자신을 호출한다고 가정합니다. 모든 사각형에는 사각형 [] []의 다음 사각형을 가리키는 Square nextSquare 포인터가 있습니다. getNext()는 nextSquare를 반환합니다.

acceptValue (i) 사각형의 객체가 i의 값과 일치하는지 확인하여 존재하지 않으면 true를 반환합니다 (행에 사각형이 있고 사각형에 할당 됨). 그것 보드에서)

나는 정말이 트릭을 할 줄 알았지 만, recurrsion 그냥 회전 유지.

내가 생각할 수있는 유일한 점은 Row 객체의 사각형이 재귀에서 값 업데이트를 얻지 못한다는 것입니다. 그리고 이것은 재귀 적 메서드가 영원히 계속 될 수 있습니다. 그러나 나는 아직도 그것이 왜 의미가 있는지를 알지 못한다. 단지 스도쿠 규칙에 따라 잘못된 값을 주어야한다.

더 많은 코드를 포함해야하는지 알려주십시오.

모든 의견을 보내 주시면 감사하겠습니다. 감사. 예상 acceptValue(i) 정말 제대로 매번 선택하므로 다른 모든 코드가 작동하는 경우

+0

처음부터'getNext()'메소드가 결코'null'을 반환하지 않는다고 말할 것입니다.하지만 더 많은 코드가 도움이 될 것입니다. 왜 이것을 디버거에서 실행하지 않습니까? –

+0

나는 디버거를 실행하는 것에 익숙하지 않다. 어떤 코드를 포함시켜야하며 디버거에서 코드를 실행하는 방법을 자세히 설명 할 수 있습니까? –

+0

이것은 내게 재귀 적으로 보이지 않습니다. 예, 당신은'setNumber()'를 호출하고 있습니다 만, 여러분은 그것을 또 다른 square_에 대해 호출하고 있습니다. 나는'for' 루프가하려고하는 것이 무엇인지,'getNext()'가'null'을 반환 할 때 그것이 의미하는 것을 알아낼 수 없습니다. 단어로 많은 코드를 설명합니다. 그것이 옳다는 것을 보장합니까 (선생님에게서 온 것처럼) 또는 게시 한 코드에 잘못된 신호를 보낼 수 있습니까? – Pops

답변

0

잘 한 가지를 들어, 당신은 후 수익을 원하는 것이 당신의 getNext().setNumber();

뭔가

for(i=1;i<10;i++){ 
    if(acceptValue(i)){ 
     value = i; 
     getNext().setNumber(); 
     return; 
    } 
} 

그렇지 않은 경우

같은 코드에서 setNumber()이 3, 4, 5 등을 반환 할 때 값으로 2를 선택했습니다.

+0

나는 이것을 시도했다, 지금 나는 무한 반복을 제거했다. 그러나 해결책은 잘못되었다. –

+0

@Aksel Mathias, 나는 그것이 될 것 같은 느낌이 들었다. 당신이 올바른 대답을 얻는 방법에 대한 당신의 논리를 검토 할 필요가있는 것 같다. 맞는 첫 번째 숫자가 상자, 행, 열 및 사각형에 항상 작동하지 않을 것입니다. 재귀 메서드는 스도쿠를 해결하기위한 무차별 방식에 더 적합합니다.이 경우 스도쿠에 맞는 숫자를 선택해야합니다 그리고 나서 다음 상자를 시도해보고 일치하지 않는 다른 번호를 찾으면 다시 돌아와서 이전 상자에 대해 다음으로 사용할 수있는 번호를 시도하십시오. – Shaded