public boolean iterate(Board board) {

        if(board.getRemainingBlocks().isEmpty()) {
            return checkWinStatus(board);
        }

        Direction direction;

        for(Block b : board.getRemainingBlocks()) {

            for(int i = 0; i < 4; i++) {

                Board copy = board.copy();

                switch(i) {
                    case 0: direction = Direction.UP; break;
                    case 1: direction = Direction.LEFT; break;
                    case 2: direction = Direction.RIGHT; break;
                    case 3: direction = Direction.DOWN; break;
                    default: direction = null;
                }

                boolean successful = b.move(copy, direction);
                b.reset();

                if(successful) {
                    copy.getRemainingBlocks().remove(b);
                    boolean foundSolution = iterate(copy);

                    if(foundSolution) {
                        String instruction = "Move " + b.getName() + " at " +
                                b.getOrigin().toString() + " " + direction.toString() + ".";
                        answerInstructions.add(instruction);
                        return true;
                    }
                }

            }

        }

        return false;

    }