private static boolean solveStage(Field f, int area) {
		if (area == 9)
			return true;
		Set<Integer> addable = new HashSet<Integer>(defElems);
		for (FieldSlot s : f.areas.get(area)) {
			addable.remove(s.getValue());
		}
		Permutation p = new Permutation(addable);
		Stack<Integer> first = p.getNext();
		if (first.isEmpty())
			return solvable(f, area) && solveStage(f, area + 1);
		for (Stack<Integer> nexts = first; !nexts.empty(); nexts = p.getNext()) {
			List<FieldSlot> backTrack = f.fillNext(area, nexts);
			if (solvable(f, area) && solveStage(f, area + 1))
				return true;
			else
				for (FieldSlot s : backTrack)
					s.setValue(0);
		}
		return false;
	}