public AbstractPuzzle(List<Integer> data, int side, int boxSize) {
		this.data = new ArrayList<Integer>(data);
		this.side = side;
		this.boxSize = boxSize;

		if (side * side != data.size()) {
			throw new IllegalArgumentException(
					"Only perfect sqare data allowed");
		}
		for (int value : data) {
			if (value > side || value < 0) {
				throw new IllegalArgumentException(
						"Cell value outside valid range");
			}
		}
	}