A mirror diagonal diamond extends Program 53’s V-shape: print the top half from 1 to rows, then mirror the same row logic from rows - 1 back to 1 — total 2n - 1 lines.
Remember
Rule: top i = 1..rows
bottom i = rows-1..1
each row: left i == j, right i == k
1 1
2 2
3 3
4 4
5
4 4
3 3
2 2
1 1 ← rows = 5
In C# reuse the same row logic twice: top with for (i = 1; i <= rows; i++), bottom with for (i = rows - 1; i >= 1; i--), then WriteLine() after each row.
Approach
How to Solve It
Reuse Program 53’s row logic twice — once counting up, once counting down from rows - 1 so the peak row is not duplicated.
Method
Idea
Best for
Two outer loops
Top 1..rows, bottom rows-1..1; same inner diagonals
Learning, interviews, exams
Rows input
Same logic with a user-chosen peak height
Practice / demos
Pseudocode
Pseudocode
for i from 1 to rows: // top half
for j from 1 to rows:
print i if i == j else a space
for k from (rows - 1) down to 1:
print i if i == k else a space
print newline
for i from (rows - 1) down to 1: // bottom half
// same row logic as above
print newline
Cheat sheet
Goal
Pattern
Top half
for (i = 1; i <= rows; i++)
Bottom half
for (i = rows - 1; i >= 1; i--)
Left diagonal
Console.Write(i == j ? j.ToString() : " ");
Right diagonal
Console.Write(i == k ? k.ToString() : " "); with k = rows-1..1
Total lines
2 * rows - 1
Write vs WriteLine
API
Effect
Use for
Console.Write
Stays on the same line
Each column (digit or space) in both halves
Console.WriteLine
Ends the current line
After both inner loops finish a row
Try it
Live Preview
Change the peak row count and the full diamond updates instantly — capped at 9 so every digit stays a single character.
Whole numbers from 1 to 9. Tap a chip or type a value — the preview redraws as you go.
Live resultrows = 5 · 9×9 cells
1 1
2 2
3 3
4 4
5
4 4
3 3
2 2
1 1
Trace
Worked Walkthrough — Peak rows = 5
Count how the two outer loops build nine lines without repeating the tip.
Outer loop
i values
Lines printed
Top
1, 2, 3, 4, 5
V-half ending with tip 5
Bottom
4, 3, 2, 1
Mirror back — skips i = 5
Total lines = 5 + 4 = 9 = 2n - 1. Each line has 2n - 1 characters → O(n²).
Code
C# Programs
Three complete programs: fixed rows = 5, user-input peak, and a compact rows = 3 demo. Use View Output for sample results.
Example 1 — Fixed rows = 5
Hard-coded peak — top loop 1..rows, bottom loop rows-1..1, same inner diagonal logic each row.
C#
using System;
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
int rows = 5;
int i, j, k;
for (i = 1; i <= rows; i++)
{
for (j = 1; j <= rows; j++)
Console.Write(i == j ? j.ToString() : " ");
for (k = rows - 1; k >= 1; k--)
Console.Write(i == k ? k.ToString() : " ");
Console.WriteLine();
}
for (i = rows - 1; i >= 1; i--)
{
for (j = 1; j <= rows; j++)
Console.Write(i == j ? j.ToString() : " ");
for (k = rows - 1; k >= 1; k--)
Console.Write(i == k ? k.ToString() : " ");
Console.WriteLine();
}
}
}
}
Output
1 1
2 2
3 3
4 4
5
4 4
3 3
2 2
1 1
How It Works
1. Top half. Same as Program 53 — i runs 1 to 5, printing the growing V.
2. Bottom half.i runs 4 down to 1 with identical inner loops — mirrors without repeating the tip.
3. Result. Nine lines forming a full diamond with digits on both diagonals.
Example 2 — User Input (rows)
Read the peak row count and draw the same full diamond.
C#
using System;
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
int rows, i, j, k;
Console.Write("Enter the number of rows: ");
if (!int.TryParse(Console.ReadLine(), out rows) || rows < 1)
{
Console.WriteLine("Please enter a positive whole number.");
return;
}
for (i = 1; i <= rows; i++)
{
for (j = 1; j <= rows; j++)
Console.Write(i == j ? j.ToString() : " ");
for (k = rows - 1; k >= 1; k--)
Console.Write(i == k ? k.ToString() : " ");
Console.WriteLine();
}
for (i = rows - 1; i >= 1; i--)
{
for (j = 1; j <= rows; j++)
Console.Write(i == j ? j.ToString() : " ");
for (k = rows - 1; k >= 1; k--)
Console.Write(i == k ? k.ToString() : " ");
Console.WriteLine();
}
}
}
}
Output (when user enters 4)
Enter the number of rows: 4
1 1
2 2
3 3
4
3 3
2 2
1 1
2. Same core. Both outer loops and both diagonal conditions adjust automatically from rows.
3. Single-digit tip. Cap demos at rows ≤ 9 so every digit stays one character wide.
Example 3 — Compact rows = 3
Same two-outer-loop structure with a smaller peak for quick paper tracing.
C#
using System;
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
int rows = 3;
int i, j, k;
for (i = 1; i <= rows; i++)
{
for (j = 1; j <= rows; j++)
Console.Write(i == j ? j.ToString() : " ");
for (k = rows - 1; k >= 1; k--)
Console.Write(i == k ? k.ToString() : " ");
Console.WriteLine();
}
for (i = rows - 1; i >= 1; i--)
{
for (j = 1; j <= rows; j++)
Console.Write(i == j ? j.ToString() : " ");
for (k = rows - 1; k >= 1; k--)
Console.Write(i == k ? k.ToString() : " ");
Console.WriteLine();
}
}
}
}
Output
1 1
2 2
3
2 2
1 1
How It Works
1. Five lines. Top prints i = 1..3; bottom prints i = 2..1 — five lines total.
2. Trace on paper. Confirm the tip 3 appears once, then the V opens again downward.
Edge Cases & Pitfalls
Check these before calling the solution done.
i = rows twice
Doubled tip
If the bottom loop starts at i = rows, the middle row prints twice. Keep for (i = rows - 1; i >= 1; i--).
missing bottom
V instead of diamond
Omitting the second outer loop leaves only Program 53’s V-half. Add the rows-1..1 pass after the tip.
k = rows
Doubled center column
If the right inner loop starts at k = rows, the middle digit doubles on each row. Keep k = rows - 1.
WriteLine
Broken rows
If WriteLine sits inside either half, each column lands on its own line. Call it only after both inner loops.
rows = 1
Single tip
Output is just 1 — the bottom loop does not run. A good sanity check.
Bad input
Convert.ToInt32 throws
Prefer int.TryParse so non-numeric input does not crash the program.
Analysis
Time and Space Complexity
Program
Time
Extra space
Fixed / compact (Examples 1, 3)
O(n²)
O(1)
User input (Example 2)
O(n²)
O(1)
2n - 1 lines × 2n - 1 characters each → about 4n² prints. For n = 5 that is 81 characters across 9 lines.
Remember
Key Takeaways
Two passes: top i = 1..rows, bottom i = rows-1..1 — same i == j / i == k row logic.
Skip the tip twice: bottom starts at rows - 1; right half starts at rows - 1.
Write vs WriteLine: columns stay on the line; WriteLine advances after both inner loops.
Next step: Program 55 fills a triangle column-wise into a 2D array.
One line: top 1..rows, bottom rows-1..1, each row prints diagonal digits with spaces, then WriteLine().
Frequently Asked Questions
The first loop prints the top V-half from i = 1 to rows. The second prints the bottom half from rows-1 down to 1, mirroring the shape.
Starting at rows would print the middle row twice. rows-1 skips the peak row already printed by the top half.
It prints digits on both diagonals per row — top half grows to rows, then the bottom half mirrors back to 1, forming a symmetric diamond.
Program 53 prints only the top V-half. Program 54 adds a second outer loop to mirror the same row logic downward.
The left loop uses i == j for the main diagonal. The right loop uses i == k for the mirrored diagonal, with spaces elsewhere.
Change rows or read it from user input with TryParse — see Example 2.
O(n²) for n rows because the diamond has about 2n-1 lines and each line scans about 2n-1 positions.
Yes. Print when i == j or i + j == rows + 1 in a single column loop.
Prefer int.TryParse(Console.ReadLine(), out rows) so bad input does not throw FormatException.
One line prints a single 1 — the bottom loop starts at 0 and does not run.
🤔
Did you know?
Program 53’s V-shape becomes a full diamond by adding a second outer loop from rows-1 down to 1. Total lines = 2n-1 with about 2n-1 characters per line — O(n²) overall.