package org.alcibiade.eternity.editor.solver.backtracking; import org.alcibiade.eternity.editor.model.AbstractQuadGrid; import org.alcibiade.eternity.editor.model.Pattern; import org.alcibiade.eternity.editor.model.QuadModel; public class Neighborhood extends AbstractQuadGrid { private static final long serialVersionUID = 1L; public Neighborhood(int width, int height) { super(width, height); } public Neighborhood(Neighborhood neighborhood) { this(neighborhood.getWidth(), neighborhood.getHeight()); for (int i = 0; i < getPositions(); i++) { neighborhood.getQuad(i).copyTo(getQuad(i)); } } public boolean isValidNeighborhood() { boolean valid = true; Pattern defpat = Pattern.getDefaultPattern(); if (getWidth() == 2) { // Corner neighborhood 2x2 valid = valid && getQuad(0, 0).countDefaultPattern() == 2; valid = valid && getQuad(1, 0).countDefaultPattern() == 1; valid = valid && getQuad(1, 0).getPattern(QuadModel.DIR_NORTH) == defpat; valid = valid && getQuad(0, 1).countDefaultPattern() == 1; valid = valid && getQuad(0, 1).getPattern(QuadModel.DIR_WEST) == defpat; valid = valid && getQuad(1, 1).countDefaultPattern() == 0; } else if (getHeight() == 2) { // Border neighborhood 3x2 valid = valid && getQuad(0, 0).countDefaultPattern() == 1; valid = valid && getQuad(0, 0).getPattern(QuadModel.DIR_NORTH) == defpat; valid = valid && getQuad(1, 0).countDefaultPattern() == 1; valid = valid && getQuad(1, 0).getPattern(QuadModel.DIR_NORTH) == defpat; valid = valid && getQuad(2, 0).countDefaultPattern() == 1; valid = valid && getQuad(2, 0).getPattern(QuadModel.DIR_NORTH) == defpat; valid = valid && getQuad(0, 1).countDefaultPattern() == 0; valid = valid && getQuad(1, 1).countDefaultPattern() == 0; valid = valid && getQuad(2, 1).countDefaultPattern() == 0; } else { assert getWidth() == 3; assert getHeight() == 3; // Inner neighborhood 3x3 for (int i = 0; i < getPositions(); i++) { valid = valid && getQuad(i).countDefaultPattern() == 0; } } for (int y = 0; y < getHeight(); y++) { for (int x = 0; x < getWidth(); x++) { QuadModel quad = getQuad(x, y); if (x < getWidth() - 1) { valid = valid && quad.getPattern(QuadModel.DIR_EAST) == getQuad(x + 1, y).getPattern( QuadModel.DIR_WEST); } if (y < getHeight() - 1) { valid = valid && quad.getPattern(QuadModel.DIR_SOUTH) == getQuad(x, y + 1) .getPattern(QuadModel.DIR_NORTH); } } } return valid; } private static final int[] indices_2x2 = { 1, 2, 3 }; private static final int[] indices_3x2 = { 0, 3, 4, 5, 2 }; private static final int[] indices_3x3 = { 1, 2, 5, 8, 7, 6, 3, 0 }; public int[] getIndices() { if (getWidth() == 2) { return indices_2x2; } else if (getHeight() == 2) { return indices_3x2; } else { return indices_3x3; } } }