import java.util.List; import java.util.LinkedList; public class Board { public boolean isSolved() { for (int i = 0; i < board.length; i++) if (!board[i].isSet()) return false; return true; } public boolean trySetField(Structure str, int strIndex, int element, Field f) { boolean validRemoveAction = removeValueFromStructures(getIndex(str, strIndex, element), f.getValue()); if (validRemoveAction && getField(str, strIndex, element).getRemainingPos().contains((Object) f.getValue())) { this.setField(str, strIndex, element, f); return true; } else return false; } protected boolean removeValueFromStructures(int index, int value) { List relatedFieldIndices = getRelatedFieldIndices(index); for (int i = 0; i < relatedFieldIndices.size(); i++) { if (!board[(Integer) relatedFieldIndices.get(i)].isSet()) { List remainingPos = board[(Integer) relatedFieldIndices.get(i)].getRemainingPos(); if (remainingPos.contains(value) && remainingPos.size() <= 1) return false; remainingPos.remove((Object)value); board[(Integer) relatedFieldIndices.get(i)] = new Field(remainingPos); } } return true; } protected int getStructureIndex(int index, Structure str) { int sqrt = (int) Math.round(Math.sqrt(Field.POSSIBILITIES)); if (str.name().equals("ROW")) return index / Field.POSSIBILITIES; else if (str.name().equals("COL")) return index % Field.POSSIBILITIES; else if (str.name().equals("BOX")) return sqrt * (index / (sqrt * Field.POSSIBILITIES)) + (index % Field.POSSIBILITIES) / sqrt; else return -1; } protected List getRelatedFieldIndices(int index) { List indices = new LinkedList(); Structure str; int strIndex; int indexProcessing; for (int i = 0; i < Structure.values().length; i++) { str = Structure.values()[i]; strIndex = getStructureIndex(index, str); for (int j = 0; j < Field.POSSIBILITIES; j++) { indexProcessing = getIndex(str, strIndex, j); if (! (indices.contains(indexProcessing) || indexProcessing == index)) { indices.add(indexProcessing); } } } return indices; } }