Краткое описание:
Я пытаюсь создать плитки квадрата с домино или, другими словами, с плитками 2x1 и 1x2.
Иногда мой алгоритм размещает вертикальную плитку таким образом, что невозможно заполнить последнюю строку.
Мой текущий подход состоит в том, чтобы инициализировать сетку нулями (скажем, сетку 8x8). Я представляю левую половину горизонтальной плитки с 1 и правую половину с 2 в сетке.
Соответственно, верхняя половина вертикальной плитки равна 3, а нижняя половина — 4.
Затем я просматриваю каждую строку сетки слева направо и там, где 0, я помещаю плитку:
- Всякий раз, когда я нахожусь на правом краю сетки или пространство справа не равно 0, я кладу вертикальную плитку (3).
- Когда я на нижнем краю, я (могу) класть только горизонтальные плитки.
- Когда ни один из вышеперечисленных не установил значение, я ставлю случайное значение (либо 1, либо 3).
Всякий раз, когда я кладу плитку (1 или 3), я также кладу соответствующую половину соответственно соседнему пространству сетки. Скажем, я поставил 1 на (i,j), затем поставил 2 на (i,j+1).
StoneMatrix = int[8][8];
for (int i = 0; i < StoneMatrix.length; i++) {
for (int j = 0; j < StoneMatrix.length; j++) {
if (StoneMatrix[i][j] != 0){
//field already set as a tile
continue;
}
if (i == StoneMatrix.length - 1) {
//bottom row
StoneMatrix[i][j] = 1;
StoneMatrix[i][j + 1] = 2;
continue;
}
if (j == StoneMatrix.length - 1) {
//right edge
StoneMatrix[i][j] = 3;
StoneMatrix[i + 1][j] = 4;
continue;
}
if (StoneMatrix[i][j + 1] != 0) {
//field to the right taken.
StoneMatrix[i][j] = 3;
StoneMatrix[i + 1][j] = 4;
continue;
}
StoneMatrix[i][j] = putOneOrThreeRandomly();
putCorrespondingAdjacentTile();
}
}
Я чувствую, что должен быть простой или более простой способ создания такой мозаики, но я пока не смог его найти. То, что я ищу, это либо какой-то источник, где описан такой алгоритм генерации, либо простое решение, которое исправляет мою ошибку.