2015-06-02 3 views
0

Делаю программу судоку и у меня есть создать 2D массив для представления 4x4 сетки, как судоку:судоку Java, эффективный способ для 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, сравнивая один индекс с другим индексом сто раз. Может быть, вы, ребята, можете помочь мне составить цикл, который сравнивается по вертикали, по горизонтали и по квадратам. планирование Im сделать судоку, как это:

[][] [][] 
[][] [][] 

[][] [][] 
[][] [][]  
//each square representing a spot for number(4x4 sudoku) 

ответ

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.

Смежные вопросы