public boolean iterate()
	{
		List<Board> allBoards;
		Iterator<Board> iter;

		allBoards = new ArrayList<Board>(states.keySet());	// Can't use the keyset directly because of
		iter = allBoards.iterator();						//  ConcurrentModificationException!
		while(iter.hasNext())
		{
			Board board = iter.next();
			if(states.containsKey(board)) // if it doesn't, the list is outdated and we don't need to handle it!
			{
				Moves moves = states.get(board);
				if(moves != null && moves.hasUnblocked())
				{
					moves.trimBlocked();
					for(int i = 0; i < moves.getNumberOfMoves(); i++)
					{
						Move move = moves.getMove(i);
						checkMove(move, moves.getMoveDepth(), solved);
					}
				} else
				{
					if(board.getPreviousMove() != null)
					{
						board.getPreviousMove().setStatus(MoveStatus.BLOCKED);
						states.remove(board);
					}
				}
			}
		}
		
		
		if(states.get(rootPosition).hasWinner())
			states.get(rootPosition).trimToWinners();
		if(!states.get(rootPosition).hasUnblocked())
			throw new IllegalArgumentException("WARNING! This puzzle appears to be unsolvable!");
		return states.get(rootPosition).hasWinner();
	}