C++ Alphabet Square Pattern (Symmetric Decreasing)

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

What Is This Pattern?

A symmetric decreasing alphabet square prints fixed-width mirrored rows whose interior floor drops from the top letter down to a single center A.

Remember
Rule: for floor i from k down to 0,
      left j = k..0 and right j = 1..k;
      print j if j > i, else print i

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     ← top = 'E' (k = 4, width 9)

The right half starts at j = 1 (B) so the center A is not duplicated. Program 29 reuses this row rule in two phases to form a full diamond.

How to Solve It

Two ways to emit the same square — inline floor checks, then optionally a shared helper for both halves.

MethodIdeaBest for
Inline j > iLeft k..0 + right 1..k with the same ternaryLearning, interviews, exams
Helper functionOne printCell owns the floor ruleCleaner demos once the rule clicks

Pseudocode

Pseudocode
k = top - 'A'
for i from k down to 0:
    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

Cheat sheet

GoalPattern
Top indexint k = top - 'A'; (4 for E)
Drop the floorfor (int i = k; i >= 0; i--)
Left halffor (int j = k; j >= 0; j--) + j > i ? alpha[j] : alpha[i]
Right halffor (int j = 1; j <= k; j++) (skip 0)
End the rowcout << "\n";
Row width2 * k + 1 (9 for A..E)
Avoid double AStart the right loop at 1, not 0

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

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

Live Preview

Change the top letter and the layered square updates instantly — width is always 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 · 5 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

Worked Walkthrough — Top = E (k = 4)

Trace each row floor and the resulting 9-letter line.

iFloor letterPrinted row
4EE E E E E E E E E
3DE D D D D D D D E
2CE D C C C C C D E
1BE D C B B B C D E
0AE D C B A B C D E

Width is always 2×4 + 1 = 9. The last row is the full palindrome around a single A. Total cells: 5 × 9 = 45.

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

Two symmetric scans per row with the same j > i check.

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

int main() {
    int k = 4; // index for 'E'
    char alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int i, j;

    for (i = k; i >= 0; i--) {
        for (j = k; j >= 0; j--)
            cout << (j > i ? alpha[j] : alpha[i]) << " ";

        for (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 alpha[4] = E.

2. Drop the floor. Outer i runs from k down to 0 — one interior floor per row.

3. Left half. Scan j from k down to 0; print alpha[j] when j > i, else alpha[i].

4. Right half, then break. Scan j from 1 to k with the same rule, then cout << "\n".

When i = 2 (floor C), columns where j > 2 print E/D borders, and interior cells print C.

Example 2 — Top Letter Input

Works for A..top with the same symmetric square. Prefer validating a single A–Z character in real apps.

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

int main() {
    char top;
    char alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int k, i, j;

    cout << "Enter top letter (like E): ";
    cin >> top;

    k = top - 'A';

    for (i = k; i >= 0; i--) {
        for (j = k; j >= 0; j--)
            cout << (j > i ? alpha[j] : alpha[i]) << " ";

        for (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 the floor loop and the two halves.

2. Same square core. Width becomes 2k + 1 (5 letters for top = C).

3. Safer input tip. Check the stream and require A–Z:

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

Example 3 — Helper Function

Often clearer to read: one function applies the floor rule so left and right loops stay thin.

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

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

int main() {
    int k = 4;
    char alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int i, j;

    for (i = k; i >= 0; i--) {
        for (j = k; j >= 0; j--)
            printCell(alpha, j, i);

        for (j = 1; j <= k; j++)
            printCell(alpha, j, i);

        cout << "\n";
    }

    return 0;
}

How It Works

1. Own the rule once. printCell applies j > i in a single place.

2. Thin loops. Left and right loops only decide which columns to visit.

3. Same shape. Output matches Examples 1–2 — useful when you want to explain the floor rule separately.

Edge Cases & Pitfalls

Check these before calling the solution done.

j = 0

Duplicate center A

If the right half starts at 0, the last row prints A twice. Keep for (j = 1; j <= k; j++).

j >= i

Wrong borders

Using j >= i changes which cells belong to the floor vs the border. Stick to strict j > i.

\n inside

Column of letters

If cout << "\n" sits 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, output is just A — right half never runs. A good sanity check.

top < A

Empty / invalid

Validate A–Z before computing k.

cin fail

Check the stream

If cin fails, top may be unset — always test if (!(cin >> top)) and require A–Z.

Time and Space Complexity

ProgramTimeExtra space
Inline loops (Examples 1–2)O(n²)O(1) (plus the fixed alphabet table)
Helper function (Example 3)O(n²)O(1)

For n = k + 1 rows of width 2k + 1, total cells = n × (2n - 1) — still quadratic in n.

Key Takeaways

  • Rule: for floor i, print j > i ? alpha[j] : alpha[i] on both halves.
  • Mirror cleanly: left k..0, right 1..k — skip duplicating center A.
  • Break the row: cout << "\n" only after both half-loops.
  • Complexity: O(n²) time; O(1) extra space.

One line: for each floor i from top down to A, scan left k..0 and right 1..k, printing j > i ? alpha[j] : alpha[i], then a newline.

Frequently Asked Questions

It prints the border letters when the column letter j is above the current row floor i; otherwise it prints i. This builds higher-letter borders with a flat interior.
The first loop scans E down to A. The second scans B up to E so the middle A is printed once and the row is mirrored.
For letters A..k, width is (k-A+1) + (k-A) = 2*(k-A)+1. For A..E, width is 9.
Pick a larger top letter (like H), set k = top - 'A', and keep the same loop structure.
O(n²) for n letters because there are n rows and each row prints O(n) cells.
Starting at 0 would print alpha[0] (A) again and duplicate the center. Starting at 1 (B) mirrors the left half cleanly.
Use cin >> top, require A–Z (or a–z), and reject failed input. Cap at Z if you only want alphabetic ranges.
Program 29 reuses the same row logic while descending to A, then mirrors upward from B to E so you get a full reverse-centered diamond without duplicating the center row.

Did you know?

Fix k at the top letter (E). Outer loop i goes from k down to A. Left half scans j = k..A; right half scans j = B..k so A appears once in the middle. Each position prints j when j > i, otherwise prints i.

Next: Reverse Centered Pyramid

Reuse this row rule in two phases to build a full diamond without duplicating the center.

Program 29 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