C++ Reverse Alphabet Pyramid Pattern (Centered)

Beginner
7 min read
Updated: Sep 2026
3 programs
Live preview

What Is This Pattern?

A reverse centered alphabet pyramid prints Program 28’s layered rows down to the A-center line, then mirrors them back up to the top letter — without printing the center twice.

Remember
Rule: PrintRow(i) = left k..0 + right 1..k with (j > i ? j : i)
      Phase 1: i = k..0   Phase 2: i = 1..k

E E E E E E E E E
E D D D D D D D E
E D C C C C C D E
E D C B B B C D E
E D C B A B C D E   ← center once
E D C B B B C D E
E D C C C C C D E
E D D D D D D D E
E E E E E E E E E     ← top = 'E' (9×9)

Program 28 is exactly the upper half. The lower phase starts at i = 1 (B) so the A-center row is not duplicated.

How to Solve It

Two ways to emit the same diamond — duplicate the row body in both phases, or factor helpers.

MethodIdeaBest for
Two phases inlineUpper k..0, lower 1..k, same row bodyLearning, interviews, exams
printCell + printRowOne place owns the floor rule and both halvesCleaner demos once the rule clicks

Pseudocode

Pseudocode
k = top - 'A'
define PrintRow(i):
    for j from k down to 0: print (j > i ? alpha[j] : alpha[i])
    for j from 1 to k:      print (j > i ? alpha[j] : alpha[i])
    print newline

for i from k down to 0: PrintRow(i)   // upper
for i from 1 to k:      PrintRow(i)   // lower

Cheat sheet

GoalPattern
Top indexint k = top - 'A'; (4 for E)
Floor rulej > i ? alpha[j] : alpha[i]
Upper phasefor (int i = k; i >= 0; i--) printRow(...);
Lower phasefor (int i = 1; i <= k; i++) printRow(...);
Skip center twiceLower starts at 1, not 0
SizeRows = width = 2k + 1
Upper half onlyProgram 28

Printing Letters vs Starting a New Line

APIEffectUse for
cout << ch << " "Stays on the same lineEach letter (and its trailing space)
cout << "\n"Ends the current lineAfter both half-loops of a row

Print cells without a newline, then end the row once.

Live Preview

Change the top letter and the reverse-centered diamond updates instantly — rows = width = 2k + 1.

One letter from A to F. Tap a chip or type a letter — the preview redraws as you go.

Live result Top E · 9 rows · width 9
E E E E E E E E E
E D D D D D D D E
E D C C C C C D E
E D C B B B C D E
E D C B A B C D E
E D C B B B C D E
E D C C C C C D E
E D D D D D D D E
E E E E E E E E E

Worked Walkthrough — Top = E (k = 4)

Trace each floor and the resulting 9-letter line across both phases.

PhaseiFloorPrinted row
Upper4EE E E E E E E E E
Upper3DE D D D D D D D E
Upper2CE D C C C C C D E
Upper1BE D C B B B C D E
Upper0AE D C B A B C D E
Lower1BE D C B B B C D E
Lower2CE D C C C C C D E
Lower3DE D D D D D D D E
Lower4EE E E E E E E E E

Width is always 2×4 + 1 = 9. Total rows are 2×5 − 1 = 9. The A-center row appears only once (upper phase).

C++ Programs

Three complete programs: fixed A–E, top-letter input, and a helper-function rewrite. Use View Output to reveal sample results.

Example 1 — Fixed A–E

Same row logic as Program 28, printed in two phases to complete the reverse centered pyramid.

C++
#include <iostream>
using namespace std;

int main()
{
    int k = 4; // index for 'E'
    const char* alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    // Upper half (E down to A)
    for (int i = k; i >= 0; i--)
    {
        for (int j = k; j >= 0; j--)
            cout << (j > i ? alpha[j] : alpha[i]) << " ";
        for (int j = 1; j <= k; j++)
            cout << (j > i ? alpha[j] : alpha[i]) << " ";
        cout << "\n";
    }

    // Lower half (B up to E) — skip repeating the A row
    for (int i = 1; i <= k; i++)
    {
        for (int j = k; j >= 0; j--)
            cout << (j > i ? alpha[j] : alpha[i]) << " ";
        for (int j = 1; j <= k; j++)
            cout << (j > i ? alpha[j] : alpha[i]) << " ";
        cout << "\n";
    }

    return 0;
}

How It Works

1. Fix the top index. k = 4 means the highest letter is E.

2. Upper phase. Floor i runs from k down to 0 — same as Program 28 through the A-center row.

3. Lower phase. Floor i runs from 1 to k so the center line is not printed twice.

4. Same row body. Both phases use left k..0 and right 1..k with j > i ? alpha[j] : alpha[i].

Example 2 — Top Letter Input

Works for A..top with the same two-phase pyramid. Prefer validating a single A–Z character in real apps.

C++
#include <iostream>
using namespace std;

int main()
{
    char top;
    cout << "Enter top letter (like E): ";
    cin >> top;

    int k = top - 'A';
    const char* alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    for (int i = k; i >= 0; i--)
    {
        for (int j = k; j >= 0; j--)
            cout << (j > i ? alpha[j] : alpha[i]) << " ";
        for (int j = 1; j <= k; j++)
            cout << (j > i ? alpha[j] : alpha[i]) << " ";
        cout << "\n";
    }

    for (int i = 1; i <= k; i++)
    {
        for (int j = k; j >= 0; j--)
            cout << (j > i ? alpha[j] : alpha[i]) << " ";
        for (int j = 1; j <= k; j++)
            cout << (j > i ? alpha[j] : alpha[i]) << " ";
        cout << "\n";
    }

    return 0;
}

How It Works

1. Prompt and scale. k = top - 'A' sets both phases and both halves.

2. Same diamond core. For top = C you get 5 rows of width 5 (2k + 1).

3. Safer input tip. Prefer:

Safer input
#include <cctype>

if (!(cin >> top))
{
    cout << "Enter one letter from A to Z.\n";
    return 1;
}
top = (char)toupper((unsigned char)top);
if (top < 'A' || top > 'Z')
{
    cout << "Enter one letter from A to Z.\n";
    return 1;
}

Example 3 — Helper Functions

Often clearer: one function owns the floor rule; another prints a full row so both phases stay thin.

C++
#include <iostream>
using namespace std;

void printCell(const char* alpha, int j, int i)
{
    cout << (j > i ? alpha[j] : alpha[i]) << " ";
}

void printRow(const char* alpha, int k, int i)
{
    for (int j = k; j >= 0; j--)
        printCell(alpha, j, i);
    for (int j = 1; j <= k; j++)
        printCell(alpha, j, i);
    cout << "\n";
}

int main()
{
    int k = 4;
    const char* alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    for (int i = k; i >= 0; i--)
        printRow(alpha, k, i);

    for (int i = 1; i <= k; i++)
        printRow(alpha, k, i);

    return 0;
}

How It Works

1. printCell owns the rule. j > i lives in one place.

2. printRow owns both halves. Left k..0 and right 1..k, then cout << "\n".

3. Thin phases. The two outer loops only decide which floors to visit.

Edge Cases & Pitfalls

Check these before calling the solution done.

i = 0

Duplicate center row

If the lower phase starts at 0, the A-center line prints twice. Keep for (i = 1; i <= k; i++).

Right j = 0

Duplicate center A in a row

The right half of each row must start at 1, same as Program 28.

\n early

Column of letters

If cout << "\n" is inside either half-loop, each cell lands on its own line. Print cells without a newline; end the row only after both halves.

top = A

Single A

When k = 0, upper prints A and lower never runs. A good sanity check.

Upper only

Program 28 by mistake

Forgetting the lower phase leaves the open square. Add for (i = 1; i <= k; i++) with the same row printer.

Bad cin

Validate one letter

Check cin >> top, optionally uppercase, and require A–Z before the outer loops.

Time and Space Complexity

ProgramTimeExtra space
Two phases inline (Examples 1–2)O(n²)O(1) (plus the fixed alphabet table)
Helper functions (Example 3)O(n²)O(1)

For n = k + 1 letters, there are 2n - 1 rows of width 2n - 1 — still quadratic in n. Roughly twice Program 28’s cell count, minus one shared center row.

Key Takeaways

  • Rule: same printRow as Program 28 — upper k..0, lower 1..k.
  • No double center: lower phase starts at B (i = 1).
  • Break the row: call cout << "\n" only after both half-loops.
  • Complexity: O(n²) time; O(1) extra space.

One line: print Program 28’s rows from k down to 0, then again from 1 up to k.

Frequently Asked Questions

The first loop decreases i from E down to A, printing each layered row toward the center. The second increases i from B back to E with the same row rule so the pyramid widens again without repeating the A-centered row.
Because the A-centered row already appears in the upper half. Starting from B prevents duplicating the center line.
If n is the number of letters from A to the top letter, total rows are 2n−1 (9 rows for A..E).
It prints the border letter when the column index j is above the current row floor i; otherwise it prints the floor letter. The same rule applies on both left and right halves of every row.
The left scan goes E down to A; the right scan goes B up to E so the middle A appears once and the row mirrors.
O(n²) because there are O(n) rows and each row prints O(n) cells.
Use cin >> top, require A–Z (optionally toupper), and reject failed input.
Program 28 is exactly the upper half of this pyramid. Program 29 reuses that row logic, then mirrors upward from B to E for the closed diamond.

Did you know?

Reuse Program 28’s row logic twice: first with i from E down to A, then with i from B up to E so the center row is not duplicated. Each row stays full width (2n-1 cells); total rows are also 2n-1 for n letters.

Next: Decreasing & Increasing Rows

Move from a layered diamond to fixed-width rows with a decreasing prefix and increasing suffix.

Program 30 tutorial →

About the author

Mari Selvan M P
Mari Selvan M P 🔗

Developer, cloud engineer, and technical writer

  • Experience 12 years building web and cloud systems
  • Focus Full Stack Development, AWS, and Developer Education

I write practical tutorials so students and working developers can learn by doing—from databases and APIs to deployment on AWS.

12 people found this page helpful