Как убедиться, что каждый блок 3х3 содержит значения в судоку - PullRequest
0 голосов
/ 09 мая 2018

Я хочу проверить всю таблицу Судоку, если все блоки получили 9 значений или нет, но я смог проверить только первый блок, и мне нужно проверить остальные 8 блоков, как?

 public static boolean checkSubs(int[][] p) {
       int[] nums = new int[9];
       int x=0, temp;
        for (int i=0; i<3; i++)
           for (int j=0; j<3; j++) {
             temp = p[i][j];
             for ( int m=0; m<nums.length; m++)
             if ( nums[m]==temp ) return false; 
             nums[x++]=temp; }
             return true; }

1 Ответ

0 голосов
/ 09 мая 2018

Вы можете изменить свой checkSubsMethod.

  • Добавьте i и j верхнего левого угла субблока судоку (например, (0,0), (0,3), ... (3,0), (3,3) ... (6,3) ), (6,6)).
  • Используйте set, чтобы проверить, используется ли уже используемое значение или нет. Метод add () класса Set возвращает true, если значение отсутствует в наборе, и false, если значение уже добавлено в набор.

И когда вы обобщаете свой метод, вы можете использовать его для полей любого размера. В вашем случае размер 9x9, вот пример

public static boolean checkSubs(int[][] p, int topI, int topJ) {
    Set<Integer> nums = new HashSet<>();
    for (int i = topI; i < topI + 3; i++) {
        for (int j = topJ; j < topJ + 3; j++) {
            if (!nums.add(p[i][j])) {
                return false;
            }
        }
    }
    return true;
}

public static void main(String[] args) {
    int[][] sudoku = {
        {1,2,3,1,2,3,1,2,3},
        {4,5,6,4,5,6,4,5,6},
        {7,8,9,7,8,9,7,8,9},
        {1,2,3,1,2,3,1,2,3},
        {4,5,6,4,5,6,4,5,6},
        {7,8,9,7,8,9,7,8,9},
        {1,2,3,1,2,3,1,2,3},
        {4,5,6,4,5,6,4,5,6},
        {7,8,9,7,8,9,7,8,9}};

    for (int i = 0; i < sudoku.length;i += 3){
        for (int j = 0; j<sudoku[0].length; j += 3){
            if (!checkSubs(sudoku, i, j)){
                System.out.println("DUPLICATED VALUES FOUND!");
                return;
            }
        }
    }
    System.out.println("OK!!");

}

Выход для этого случая будет OK!!

Если вы измените ввод, как это

 int[][] sudoku = {
 {3,3,3,1,2,3,1,2,3},
 {4,5,6,4,5,6,4,5,6},
 {7,8,9,7,8,9,7,8,9},
 {1,2,3,1,2,3,1,2,3},
 {4,5,6,4,5,6,4,5,6},
 {7,8,9,7,8,9,7,8,9},
 {1,2,3,1,2,3,1,2,3},
 {4,5,6,4,5,6,4,5,6},
 {7,8,9,7,8,9,7,8,9}};

Выход будет DUPLICATED VALUES FOUND!

В будущем вы можете изменить этот пример для своих целей.

...