我正在写一个数独求解器,现在我已经被困了几个小时,我无法让它工作。
求解器可以容纳多达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++;
}
}
}
答案 0 :(得分:1)
问题可能来自cntKol
方法中的ruterIBoks2
变量。
您将其设置为k * 1
(您可以将其设置为k),首先等于0,因为它是您的for
条件。
问题是您想要访问数组中的cntKol - 1
元素。
bokser[i][j] = ruter[cntRad][cntKol - 1];
或者换句话说第-1个元素,这可能是你麻烦的原因。