问题描述
|
在学校的作业中,我们应该做一个soduko求解器。我有一个递归方法,应该可以帮助我解决soduko难题。它是这样的:
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;
}
}
}
Board类具有initGrid方法,该方法创建所有Square并使用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 ...
Row类的对象希望将添加到它们的正方形对象保存在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.\");
}
}
关于半递归方法
该方法在Square类内部,所有正方形都组装成二维数组。该方法假设针对数独板上的每个方块调用自己。所有正方形都有一个Square nextSquare指针,该指针指向squares [] []中的下一个正方形。 getNext()返回nextSquare。
acceptValue(i)检查Squares'Row以查看是否存在带有i值的Square对象,如果不存在,则返回true(Row有一个square [],其squares分配给它从董事会)
我真的以为这可以解决问题,但是复发只会持续不断。
我唯一能想到的是,行对象中的正方形可能不会在递归中进行值更新,而这可能会导致递归方法永远持续下去。但是我仍然不明白为什么这样做会有意义,根据数独规则它应该给我错误的值。
请告知我是否应该包括更多代码。
任何建议,不胜感激。谢谢。
解决方法
好吧,如果您的所有其他代码都能按预期运行,并且
acceptValue(i)
每次都会正确选择,那么您会想在getNext().setNumber();
之后返回
就像是
for(i=1;i<10;i++){
if(acceptValue(i)){
value = i;
getNext().setNumber();
return;
}
}
否则,如果代码在setNumber()
返回时选择2作为值,它将尝试3、4、5 ...,依此类推。