private ArrayList<ArrayList<Cell>> splitNormalSeatsIntoBlocks() {
        // Calculate how many blocks to split the plane into
        int numberOfRows = this.planeDimension.getNumberOfNormalRows();
        // Check the number of rows per block is a valid number
        if (numberOfRows < this.numberOfRowsPerBlock) {
            this.numberOfRowsPerBlock = numberOfRows;
        } else if (this.numberOfRowsPerBlock > numberOfRows) {
            this.numberOfRowsPerBlock = numberOfRows;
        }
        int numberOfBlocks = numberOfRows / numberOfRowsPerBlock;
        int remainder = numberOfRows % numberOfRowsPerBlock;

        // Get the normal seats for the plane and set the current row index
        Cell[][] normalSeats = this.planeDimension.getNormalSeats();
        int currentRowIndex = 0;

        // Create a container to hold the blocks of seats
        ArrayList<ArrayList<Cell>> blocks = new ArrayList<>();

        // Loop over each block
        for (int x = 0; x < numberOfBlocks; x++) {
            // Calculate the number of rows to get for this block
            int numberOfRowsToGet = numberOfRowsPerBlock;

            if (remainder > 0) {
                if (x == numberOfBlocks - 1) {
                    numberOfRowsToGet += remainder;
                    remainder = 0;
                } else {
                    numberOfRowsToGet++;
                    remainder--;
                }
            }

            // Create the containder to hold the seats for this block
            ArrayList<Cell> blockSeats = new ArrayList<>();

            // Loop over the total number of rows to get
            for (int y = 0; y < numberOfRowsToGet; y++) {
                // Add all of the seats from that row into the array
                blockSeats.addAll(Arrays.asList(normalSeats[currentRowIndex++]));
            }

            blocks.add(blockSeats);
        }

        return blocks;
    }