2013-05-02 2 views
0

У меня возникли проблемы с делением 2D-массива на ящики, как в судоку. У меня есть массив квадратов в моем объекте доски, и я хочу разделить их на квадраты 2x3 или 3x3. Объекты box имеют 1D-массив для отслеживания квадратов.Разделение 2D-массива на ящики

к это номер ящика, в 9х9 судоку, ящики будут пронумерованы от 0 до 8.

int l = 0; 
for(int i=k*a; i<k*a+a;i++){ 
     for(int j=k*b;j<k*b+b;j++){ 
      narray[l]=brd.getSquare(i,j); 
      brd.getSquare(i,j).setBox(this); 
      l++; 
    } 

Это получает первое право коробки, но гаснет после этого. Я думал об этом часами, и я не могу обернуться вокруг него. У кого-нибудь есть опрятный трюк?

+0

Вы индексируете строку/столбец с k. Вам, по крайней мере, потребуется отдельная переменная для этих двух, нет? – munch1324

+0

Итак, нет способа получить индекс, чтобы начать итерацию, просто используя номер окна? –

+0

Я не играл в судоку, но это 2D-сетка, правильно? поэтому, если у вас есть сетка 9x9, индексы должны быть 0-80 (9 * 9). Я отредактирую свой ответ ниже – munch1324

ответ

1

Таким образом, я предполагаю, что коробки пронумерованы следующим образом:

012 
345 
678 

(и коробки состоят из 3x3 ячеек каждый)

Если i и j - это координаты x и y, вам необходимо перевести вышеуказанные в координаты. Что-то вроде:

0 1 2 3 4 5 6 7 8 

x 0 1 2 0 1 2 0 1 2 
y 0 0 0 1 1 1 2 2 2 

Так x = k%3 и y = k/3.

В реальной сетки х и у должно начинаться с 0, 3 и 6, а не 0, 1 и 2, так что просто умножить на 3.

Так что-то вроде этого следует сделать это: (изменяется в зависимости от которая является координатой x и которая равна y)

int size = 3; 
int l = 0; 
for(int i = 0; i < size; i++){ 
    for(int j = 0; j < size; j++){ 
     int x = i + k % size * size; 
     int y = j + k/size * size; 
     narray[l] = brd.getSquare(x, y); 
     brd.getSquare(x, y).setBox(this); 
     l++; 
    } 
} 
+0

Это работало отлично, за исключением одного. Когда k равно 2, i снова становится 0, поэтому он снова захватывает тот же квадрат, что и поле 0. Это также должно работать для неравномерных ящиков, т.е. 2x3, не так ли? –

+0

@ BjørnHaugerud Он должен работать для неравномерных ящиков, просто измените 'size' на 2 переменные, один для' x' и один для 'y' с соответствующими размерами. Не уверен, что проблема 'i' становится 0, не вижу проблемы с моим кодом. – Dukeling

0

Если вы хотите использовать один номер для индексации 2D-массива, используйте функции mod/divide.

row = index/row_size; 
col = index % col_size; 

Ваш индекс должен быть в диапазоне от 0 до (row_size * col_size -1)

+0

О, извините за плохой вопрос. Этот метод принимает номер окна ввода. Я исправлю –

+0

Очень хорошо, я попробую это сейчас, спасибо! –

0

Так что, похоже, вы просто хотите получить столбец строк и столбцов.

int boxsize = 3; 
int h = 9; //height 
inh w = 9; //width 
for (int r =0;r<h;r++){ 
    for (int c=0;c<w;c++){ 
     int br = r/boxsize; 
     int bc = c/boxsize; 
     int index = br*h + c; 
     narray[index]=brd.getSquare(br,bc); 
     System.out.println("box row =" + br +" box column =" + bc); 
    } 
} 
Смежные вопросы