Средство проверки блоков судоку Java

Я создаю средство проверки судоку, а также средство проверки строк и столбцов. В настоящее время я пытаюсь сделать проверку блоков (блок 3x3). Любое понимание этого было бы здорово.

public boolean checkBlock (int col0to2, int row0to2)
 {
   int [] tempArray = new int [3];
   for (int x=0; x<3; x++)
   {
     for (int y=0; y<3;y++)
      {
        if ((board [col0to2+x][row0to2+y]) > 0 && (board [col0to2+x][row0to2+y]) < 10)
        {
          int tempVal = board [col0to2+x][row0to2+y];
          tempArray [tempVal - 1] = tempVal; // i think this line is giving me the run 
                                            // error   
    }
  } 
}
 return true;
}

person Alex    schedule 24.04.2013    source источник
comment
если у вас есть функция проверки строк и функция проверки столбцов, просто зациклируйте их   -  person Randy    schedule 25.04.2013
comment
Здесь есть средство проверки блоков (наряду с другими) здесь.   -  person OldCurmudgeon    schedule 25.04.2013


Ответы (4)


Существует 9 возможных значений, поэтому ваш массив должен иметь размер 9, а не 3.

Считать нужно только в том случае, если ячейка уже заполнена. Если это так, верните false. Если вы дойдете до конца, не вернув false, верните true.

++ увеличивает возвращаемое значение, чтобы вы могли его сравнить. Если это 2, то ячейка уже была увеличена.

Код:

public class BlockTest {
  public static boolean checkBlock (int col0to2, int row0to2)
  {
    int [] tempArray = new int[9];
    for (int x=0; x<3; x++)
    {
      for (int y=0; y<3;y++)
      {
        int tempVal = board [col0to2+x][row0to2+y];
        if (tempVal < 1 || tempVal > 9) return false;
        if (++tempArray[tempVal - 1] == 2) return false;
      } 
    }
    return true;
  }

  public static int[][] board = new int[9][9];
  public static void main(String[] args) {
    for(int i = 0; i < 3; i++) {
      for(int j = 0; j < 3; j++) {
        board[i][j] = i*3 + j + 1;
      }
    }
    System.out.println(checkBlock(0,0));
    board[0][0] = 7;
    System.out.println(checkBlock(0,0));
  }
}

Выход:

true
false
person durron597    schedule 24.04.2013

if ((board [col0to2+x][row0to2+y]) > 0 && (board [col0to2+x][row0to2+y]) < 10) {
      int tempVal = board [col0to2+x][row0to2+y];
      tempArray [tempVal - 1] = tempVal; // i think this line is giving me the run error

}

Ваша проверка границ для tempval заключается в том, что она должна быть от 1 до 9 включительно. Предположим, что это 9. Затем вы назначаете tempArray[8] = 9. Здесь вы сталкиваетесь с проблемой, поскольку tempArray был инициализирован как массив, содержащий 3 элемента.

Я думаю, вы хотите что-то вроде:

tempArray = new int[9]

и задание будет

tempArray[x*3 + y] = tempVal;

Я не проверял это, но в основном он заполняет массив каждым найденным числом.

person NG.    schedule 24.04.2013
comment
о, хорошо, я понимаю, что вы имеете в виду, большое спасибо! Я попробую это! - person Alex; 25.04.2013

Поскольку вам нужно иметь дело с числами 1-9, вам нужно место для 9 целых чисел в tempArray, но вы объявляете, что оно будет длиной всего 3. Кроме того, вы на самом деле не проверяете, используются ли все номера (и ни один из них не дублируется).

public boolean checkBlock (int col0to2, int row0to2) {
   int [] tempArray = new int [9];
   for (int x=0; x<3; x++) {
      for (int y=0; y<3;y++) {
         int tempVal = board [col0to2+x][row0to2+y];
         if (tempVal > 0 && tempVal < 10) {
            if (tempArray[tempVal - 1] != 0) {
               return false;
            }
            tempArray [tempVal - 1] = tempVal;
         }
      } 
   }
   return true;
}
person Ted Hopp    schedule 24.04.2013

Я понимаю, откуда вы это взяли, но, как говорили другие люди, ваш tempArray должен содержать 9 значений. Раньше я писал средство проверки судоку (однозначное назначение, проверка решения была правильной, преодолел отметку 90% для всего приложения судоку), и я предпочитал иметь массив с 9 значениями, каждое из которых представляет 1-9 цифр, но вместо того, чтобы установить значение tempVal, я увеличил его. Облегчает проверку того, что вы получили только одно из каждого числа.

int [] boxCounts = {0, 0, 0, 0, 0, 0, 0, 0, 0};

// X loop
    // y loop
        // get value
        boxCounts[value - 1]++;
    // end y loop
// end x loop

// check we found one of each
for(int j = 0; j < 9; j++) {
    if(boxCounts[j] != 1 )
        return false;
    }
}
person eldris    schedule 24.04.2013
comment
интересный! Я тоже так попробую! спасибо :) Я сижу здесь часами, пытаясь понять это! - person Alex; 25.04.2013
comment
Мне потребовалось некоторое время, чтобы понять это для моего задания. Я бы опубликовал свою полную проверку, но это одна из тех вещей, которые полезны для мозга, чтобы найти собственное решение. - person eldris; 25.04.2013
comment
конечно, я бы не хотел давать полный ответ, потому что это было бы жульничеством! Единственный способ научиться – это практиковаться! - person Alex; 26.04.2013
comment
О, хороший, разумный ученик! Я клянусь, что многие люди приходят сюда, ожидая, что люди дадут им решение, чтобы им не пришлось решать его самостоятельно! Удачи с остальным кодированием на этом :) - person eldris; 27.04.2013