我正在制作一个数独游戏程序,我已经建立了2D数组来代表像sudoku这样的4x4网格:
int getNumber (String str)
{
if (str.equals (""))
{
return 0;
}
return Integer.parseInt (str);
}
int[][] sudoku = new int [4][4];
sudoku[0][0] = getNumber(t1.getText());
sudoku[1][0] = getNumber(t2.getText());
sudoku[2][0] = getNumber(t5.getText());
sudoku[3][0] = getNumber(t6.getText());
sudoku[0][1] = getNumber(t3.getText());
sudoku[1][1] = getNumber(t4.getText());
sudoku[2][1] = getNumber(t7.getText());
sudoku[3][1] = getNumber(t8.getText());
sudoku[0][2] = getNumber(t9.getText());
sudoku[1][2] = getNumber(t10.getText());
sudoku[2][2] = getNumber(t13.getText());
sudoku[3][2] = getNumber(t14.getText());
sudoku[0][3] = getNumber(t11.getText());
sudoku[1][3] = getNumber(t12.getText());
sudoku[2][3] = getNumber(t15.getText());
sudoku[3][3] = getNumber(t16.getText());
所以,我的观点是你知道水平,垂直和盒子(在这种情况下是2x2)可以有相同的数字。因为我不想写一堆if语句将一个索引与其他索引进行百次比较。也许你们可以帮我制作一个垂直,水平和正方形比较的循环。我打算像这样制作数独:
[][] [][]
[][] [][]
[][] [][]
[][] [][]
//each square representing a spot for number(4x4 sudoku)
答案 0 :(得分:0)
在我看来,如果使用1D数组而不是2D数据,算法会变得更简单。无论数据结构如何,将其打印为表格都是微不足道的。
使用Java 8可能的解决方案如下:
private static final int SIZE = 4;
private static final int BOX = 2;
private int[] sudoko = new int[SIZE * SIZE];
private boolean hasDuplicate(int pos) {
int value = sudoko[pos];
return IntStream.range(0, SIZE * SIZE)
.filter(p -> p != pos)
.filter(p -> sameRow(p, pos) || sameCol(p, pos) || sameBox(p, pos))
.anyMatch(p -> sudoko[p] == value);
}
private boolean sameRow(int pos1, int pos2) {
return pos1 / DIM == pos2 / DIM;
}
private boolean sameCol(int pos1, int pos2) {
return pos1 % DIM == pos2 % DIM;
}
private boolean sameBox(int pos1, int pos2) {
return pos1 / SIZE / BOX == pos2 / SIZE / BOX && pos1 % SIZE / BOX == pos2 % SIZE / BOX;
}
您可以对2D阵列使用相同的算法,但是您需要比IntStream
更复杂的东西。