数独求解器,让框指向右边的图块

时间:2016-04-21 07:45:01

标签: java arrays algorithm for-loop sudoku

我正在写一个数独求解器,现在我已经被困了几个小时,我无法让它工作。

求解器可以容纳多达64个瓷砖的任何尺寸的板,并且盒子可以是任何矩形形状。我创建了电路板并以二维阵列创建了所有的瓷砖,这样零件就可以了。当我想在他们的盒子里放置相同的瓷砖时会出现问题。

 0 -> 0 1 0 | 0 0 4 <- 1
      0 0 0 | 8 0 0 
      ------------- 
 2 -> 0 0 0 | 0 0 1 <- 3
      1 0 0 | 2 7 0
      ------------- 
 4 -> 0 0 0 | 9 0 0 <- 5
      0 2 0 | 0 0 0

所以像这样的电路板,盒子从左到右编号如上所示。瓷砖的编号如下:

tile[row][column] 

例如:&#34; 4&#34;在右上角是棋盘上的牌[0] [5]。

所以现在对手头的问题。这些盒子有一个像盒子一样大小的二维数组,每个数组都应该指向电路板上的右边瓷砖。电路板和盒子已经创建,我只需要盒子的阵列指向电路板上的右侧瓷砖。

例如:箱号&#34; 3&#34;应该有二维数组,其中六个值为:

[0][0] = 0; [0][1] = 0; [0][2] = 1;
[1][0] = 2; [1][2] = 7; [1][3] = 0;

我尝试了很多for循环嵌套,但是我无法为每个给定的场景选择合适的磁贴。给出的数独板可以是任何尺寸的盒子,形状为任何矩形。

编辑:我写的代码,它是挪威语的代码,询问是否有任何不清楚。

Edit2:问题出在Brett-class的最后一个方法中。

class SudokuSolver {
    public static void main(String[] args) throws Exception {
        Brett sudoku = lesFil(args[0]);



    }

    //Creates the sudoku board from a txt-file.
    public static Brett lesFil(String filnavn) throws Exception {
        Scanner fil = new Scanner(new File(filnavn));
        String linje = "";

        int antRad = Integer.parseInt(fil.nextLine());
        int antKol = Integer.parseInt(fil.nextLine());
        int antBoks = 0;
        //antall Bo(kser), Ra(der) og Ko(lonner)
        int antBoRaKo = antRad * antKol;
        Brett nyttBrett = new Brett(antBoRaKo, antRad, antKol);
    nyttBrett.bokser[antBoks] = new Boks(antBoRaKo);

        for(int i = 0; fil.hasNextLine(); i++) {
            if(i == antRad) {
        antBoks++;
                nyttBrett.bokser[antBoks] = new Boks(antBoRaKo);
            }
            linje = fil.nextLine();

            for(int j = 0; j < linje.length(); j++) {
                if(j == antKol) {
            antBoks++;
                    nyttBrett.bokser[antBoks] = new Boks(antBoRaKo);
                }

                Rute nyRute = new Rute(tegnTilVerdi(linje.charAt(j)));
                nyttBrett.ruter[i][j] = nyRute;
                nyttBrett.bokser[antBoks-1].ruter[i][j] = nyRute;
            }
        }

        return nyttBrett;
    }

    //Sign to value.
    //Gikk utifra at 0 skal representere en tom rute.
    public static int tegnTilVerdi(char tegn) {
        if (tegn == '.') {
            return 0;
        } else if ('1' <= tegn && tegn <= '9') {    // tegn er i [1, 9]
            return tegn - '0';
        } else if ('A' <= tegn && tegn <= 'Z') {    // tegn er i [A, Z]
            return tegn - 'A' + 10;
        } else if (tegn == '@') {                   // tegn er @
            return 36;
        } else if (tegn == '#') {                   // tegn er #
            return 37;
        } else if (tegn == '&') {                   // tegn er &
            return 38;
        } else if ('a' <= tegn && tegn <= 'z') {    // tegn er i [a, z]
            return tegn - 'a' + 39;
        } else {                                    // tegn er ugyldig
            return -1;
        }
    }
}

//Board-class where I am trying to match the boxes with the board.
class Brett {
Rute[][] ruter;
Boks[] bokser;
//antall bokser, antall rader og kolonner i hver boks.
int antBoks, antRad, antKol;

Brett(int antBoks, int antRad, int antKol) {
    ruter = new Rute[antBoks][antBoks];
    bokser = new Boks[antBoks];
    this.antBoks = antBoks;
    this.antRad = antRad;
    this.antKol = antKol;
}

//My last try of many, probably not my best try.
public void ruterIBoks2() {
    int cntRad = 0;
    for(int k = 0; k < antBoks; k++) {
        int cntKol = 1 * k;
        for(int i = 0; i < antRad; i++) {
            for(int j = 0; j < antKol; j++) {
                bokser[i][j] = ruter[cntRad][cntKol - 1];
                cntKol++;
            }
            cntRad++;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

问题可能来自cntKol方法中的ruterIBoks2变量。

您将其设置为k * 1(您可以将其设置为k),首先等于0,因为它是您的for条件。

问题是您想要访问数组中的cntKol - 1元素。

bokser[i][j] = ruter[cntRad][cntKol - 1];

或者换句话说第-1个元素,这可能是你麻烦的原因。