可能重复: 数独算法,蛮力
有关几天我试图写一个蛮力算法求解数独,我的问题是,我从来没有真的得到了算法的工作100%,可有人请直接与我,给一些帮助?
该算法位于广场类,递归函数。
公共抽象类广场{ 接下来的私人广场; 私人箱箱; 私人排排; 私人Columne columne; 私人int值; 广场(int值,箱盒,鳞次栉比,Columne columne){ THIS.VALUE =价值; this.box =盒; this.row =行; this.columne = columne; } 无效setNumberMeAndTheRest(董事会板){ 如果(GETNEXT()== NULL){ 的System.out.println(下一个==空); 的for(int i = 1; I< = board.getDimension();我++){ 如果(legalValue(i))的{ 的setValue(ⅰ); } } board.saveSolution(); 返回; } 其他 { 如果(这的instanceof DefinedSquare){ GETNEXT()setNumberMeAndTheRest(板)。 } 其他 { 的for(int i = 1; I< = board.getDimension();我++){ 如果(legalValue(i))的{ 的setValue(ⅰ); GETNEXT()setNumberMeAndTheRest(板)。 } } 返回; } } } INT的getValue(){ 返回值; } 无效的setValue(int值){ THIS.VALUE =价值; } 无效setNext(广场旁边){ this.next =下一个; } 公共广场GETNEXT(){ 返回下一个; } / ** *如果值是合法的箱子,行和列的检查。 *参数值来检查。 * @返回true,如果值是合法的,否则为假。 * / 布尔legalValue(int值){ 如果(box.legalValue(值)及和放大器; row.legalValue(值)及和放大器; columne.legalValue(值)){ 返回true; } 返回false; }解决方案
我认为你的问题可能会躺在这里
的for(int i = 1; I< = board.getDimension();我++){ 如果(legalValue(i))的{ 的setValue(ⅰ); GETNEXT()setNumberMeAndTheRest(板)。 } }如果legalValue(我)将返回true的独立的i的当前状态,那么你就回追踪,如果没有,你不回溯
然而,大多数回溯看起来就像是osmething像htis
的for(int i = 1; I< = board.getDimension();我++){ 如果(legalValue(i))的{ 的setValue(ⅰ); //布尔值,指示液是否被发现 如果(GETNEXT()。setNumberMeAndTheRest(板)) 返回true; 其他 unsetValue㈠ } }我们需要更多的code知道,如果legalValue时方我已经设置返回false
试试这个,看看我是在正确的轨道或交的所有的你的code
的System.out.println(启动迭代) 的for(int i = 1; I< = board.getDimension();我++){ 如果(legalValue(i))的{ 的System.out.println(GOING+ I) 的setValue(ⅰ); GETNEXT()setNumberMeAndTheRest(板)。 } } 的System.out.println(结束迭代)如果它填补了网格,然后停止,不回溯,你的问题是,你调用的setValue(我),然后调用legalValue第(i + 1),它是返回false ,因为该值alraedy集,不因为它是不合法。如果是这样的话,你需要一个相当的未设置的reucrsion后
Possible Duplicate: Sudoku algorithm, brute force
For several days I have tried to write a brute force algorithm for solving sudoku, my problem is that I never realy get the algorithm to work 100 %, can someone please direct me and give some help ?
The Algorithm is located in Square class, recursive function.
public abstract class Square { private Square next; private Box box; private Row row; private Columne columne; private int value; Square(int value, Box box, Row row, Columne columne) { this.value = value; this.box = box; this.row = row; this.columne = columne; } void setNumberMeAndTheRest(Board board) { if(getNext() == null) { System.out.println("next == null"); for(int i = 1; i <= board.getDimension(); i++) { if(legalValue(i)) { setValue(i); } } board.saveSolution(); return; } else { if(this instanceof DefinedSquare) { getNext().setNumberMeAndTheRest(board); } else { for(int i = 1; i <= board.getDimension(); i++) { if(legalValue(i)) { setValue(i); getNext().setNumberMeAndTheRest(board); } } return; } } } int getValue() { return value; } void setValue(int value) { this.value = value; } void setNext(Square next) { this.next = next; } public Square getNext() { return next; } /** * Checks if value is legal in box, row and column. * @param value to check. * @return true if value is legal, else false. */ boolean legalValue(int value) { if(box.legalValue(value) && row.legalValue(value) && columne.legalValue(value)) { return true; } return false; }解决方案
I think your problem may lie here
for(int i = 1; i <= board.getDimension(); i++) { if(legalValue(i)) { setValue(i); getNext().setNumberMeAndTheRest(board); } }If legalValue(i) returns true independent of the current state of i, then you're back tracking, if not, you're not backtracking
What most backtracking looks like is osmething like htis
for(int i = 1; i <= board.getDimension(); i++) { if(legalValue(i)) { setValue(i); // boolean indicating whether solution was found if(getNext().setNumberMeAndTheRest(board)) return true; else unsetValue(i) } }We need more code to know if legalValue returns false when square i is already set
Try this to see if I'm on the right track or post all of your code
System.out.println("STARTING ITERATION") for(int i = 1; i <= board.getDimension(); i++) { if(legalValue(i)) { System.out.println("GOING " + i) setValue(i); getNext().setNumberMeAndTheRest(board); } } System.out.println("ENDING ITERATION")If it fills out the grid and then stops without backtracking, your problem is that you calling setValue(i) and then calling legalValue(i+1) and it is return false because the value is alraedy set, not because it's not legal. If this is so, you need an equivalent 'unset' after the reucrsion
更多推荐
蛮力数独算法
发布评论