Print symmetric double triangle pattern

Given a value n, we need to print the following pattern accordingly, using only constant extra space.

Examples:

Input : n = 1
Output : x

Input : n = 2
Output :  
 x 
x x 
 x 

Input: n = 5
Output:
    x                                   
     x 
    o x 
     o x 
x o x o x 
 x o 
  x o 
   x 
    x 

Input: n = 6
Output:
     x 
      x 
     o x 
      o x 
     x o x 
x o x x o x 
 x o x 
  x o 
   x o 
    x 
     x

Input : n = 7;
Output :
      x 
       x 
      o x 
       o x 
      x o x 
       x o x 
x o x o x o x 
 x o x 
  x o x 
   x o 
    x o 
     x 
      x 

Input : n = 8;
Output : 
       x 
        x 
       o x 
        o x 
       x o x 
        x o x 
       o x o x 
x o x o o x o x 
 x o x o 
  x o x 
   x o x 
    x o 
     x o 
      x 
       x 


We can divide this problem into 3 parts:
1) Print upper half with n-1 lines for odd n or n-2 lines for even n.
2) Print middle lines, 1 line for odd n or 3 lines for even n.
3) Print lower half, with n-1 lines for odd n or n-2 lines for even n.

For such complex patterns it may be easier if we can use 1-based indexing
and separate functions to print characters beginning with x or o.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// Author:: Satish Srinivas
#include <iostream>
  
using namespace std;
  
// print alternate x o beginning with x
void printx(int n)
{
    for (int i = 1; i <= n; i++) {
        if (i % 2 != 0)
            cout << "x ";
        else
            cout << "o ";
    }
    return;
}
  
// print alternate x o beginning with o
void printo(int n)
{
    for (int i = 1; i <= n; i++) {
        if (i % 2 != 0)
            cout << "o ";
        else
            cout << "x ";
    }
    return;
}
  
// print the pattern for n
void printPattern(int n)
{
    // upper half
    // n-1 lines for odd, n-2 lines for even
    int x = n;
  
    if (n % 2 == 0)
        x = x - 1;
  
    // number of spaces to leave in each line
    int p = n - 1;
  
    // number of characters in each line
    int s = 1;
  
    // prints double lines in each iteration
    for (int i = 1; i <= (x - 1) / 2; i++) {
        for (int j = 1; j <= p; j++) {
            cout << " ";
        }
  
        if (i % 2 != 0)
            printx(s);
        else
            printo(s);
  
        cout << endl;
        p++;
  
        for (int j = 1; j <= p; j++) 
            cout << " ";        
  
        if (i % 2 != 0)
            printx(s);
        else
            printo(s);
  
        cout << endl;
  
        p--;
        s++;
    }
  
    // extra upper middle for even
    if (n % 2 == 0) {
        for (int i = 1; i <= p; i++)
            cout << " ";
  
        if (n % 4 != 0)
            printx(n / 2);
        else
            printo(n / 2);
  
        cout << endl;
    }
  
    // middle line
    if (n % 2 != 0) 
        printx(n);
      
    else {
        if (n % 4 != 0) {
            printx(n / 2);
            printx(n / 2);
        }
        else {
            printx(n / 2);
            printo(n / 2);
        }
    }
  
    cout << endl;
  
    // extra lower middle for even
    if (n % 2 == 0) {
        cout << " ";
        printx(n / 2);
        cout << endl;
    }
  
    // lower half
    p = 1;
  
    if (n % 2 == 0) {
        x--;
        p = 2;
    }
  
    int q = x / 2;
  
    // one line for each iteration
    for (int i = 1; i <= x; i++) {
        for (int j = 1; j <= p; j++)
            cout << " ";
  
        printx(q);
  
        if (i % 2 == 0)
            q--;
  
        cout << endl;
  
        p++;
    }
  
    cout << endl;
}
  
// Driver code
int main()
{
    int n = 7;
    printPattern(n);
    n = 8;
    printPattern(n);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// java program to Print symmetric 
// double triangle pattern
class GFG
{
          
    // print alternate x o beginning with x
    static void printx(int n)
    {
        for (int i = 1; i <= n; i++) {
            if (i % 2 != 0)
                System.out.print("x ");
            else
                System.out.print("o ");
        }
        return;
    }
      
    // print alternate x o beginning with o
    static void printo(int n)
    {
        for (int i = 1; i <= n; i++) {
            if (i % 2 != 0)
                System.out.print("o ");
            else
                System.out.print("x ");
        }
        return;
    }
      
    // print the pattern for n
    static void printPattern(int n)
    {
        // upper half n-1 lines for
        // odd, n-2 lines for even
        int x = n;
      
        if (n % 2 == 0)
            x = x - 1;
      
        // number of spaces to leave in each line
        int p = n - 1;
      
        // number of characters in each line
        int s = 1;
      
        // prints double lines in each iteration
        for (int i = 1; i <= (x - 1) / 2; i++) {
            for (int j = 1; j <= p; j++) {
                System.out.print(" ");
            }
      
            if (i % 2 != 0)
                printx(s);
            else
                printo(s);
      
            System.out.println();
            p++;
      
            for (int j = 1; j <= p; j++) 
                System.out.print(" ");     
      
            if (i % 2 != 0)
                printx(s);
            else
                printo(s);
      
            System.out.println();
      
            p--;
            s++;
        }
      
        // extra upper middle for even
        if (n % 2 == 0) {
            for (int i = 1; i <= p; i++)
                System.out.print(" ");
      
            if (n % 4 != 0)
                printx(n / 2);
            else
                printo(n / 2);
      
            System.out.println();
        }
      
        // middle line
        if (n % 2 != 0
            printx(n);
          
        else {
            if (n % 4 != 0) {
                printx(n / 2);
                printx(n / 2);
            }
            else {
                printx(n / 2);
                printo(n / 2);
            }
        }
      
        System.out.println();
      
        // extra lower middle for even
        if (n % 2 == 0) {
            System.out.print(" ");
            printx(n / 2);
            System.out.println();
        }
      
        // lower half
        p = 1;
      
        if (n % 2 == 0) {
            x--;
            p = 2;
        }
      
        int q = x / 2;
      
        // one line for each iteration
        for (int i = 1; i <= x; i++) {
            for (int j = 1; j <= p; j++)
                System.out.print(" ");
      
            printx(q);
      
            if (i % 2 == 0)
                q--;
      
            System.out.println();
      
            p++;
        }
      
        System.out.println();
    
      
    // Driver code
    public static void main (String[] args)
    {
        int n = 7;
        printPattern(n);
          
        n = 8;
        printPattern(n);
    }
}
  
  
// This code is contributed by Anant Agarwal.

chevron_right


Python3

# Python3 program to Print symmetric
# double triangle pattern

# Print alternate x o beginning with x
def printx(n):

for i in range(1, n + 1):
if (i % 2 != 0):
print(“x “, end = “”)
else:
print(“o “, end = “”)

return

# Print alternate x o beginning with o
def printo(n):

for i in range(1, n + 1):
if (i % 2 != 0):
print(“o “, end = “”)
else:
print(“x “, end = “”)

return

# Print the pattern for n
def printPattern(n):

# upper half
# n-1 lines for odd,
# n-2 lines for even
x = n

if (n % 2 == 0):
x = x – 1

# number of spaces to leave
# in each line
p = n – 1

# number of characters in each line
s = 1

# prints double lines in each iteration
for i in range(1, (x – 1) // 2 + 1):
for j in range(1, p + 1):
print(” “, end = “”)

if (i % 2 != 0):
printx(s)
else:
printo(s)

print()
p += 1

for j in range(1, p + 1):
print(” “, end = “”)

if (i % 2 != 0):
printx(s)
else:
printo(s)

print()

p -= 1
s += 1

# extra upper middle for even
if (n % 2 == 0):
for i in range(1, p + 1):
print(” “, end = “”)

if (n % 4 != 0):
printx(n // 2)
else:
printo(n // 2)

print()

# middle line
if (n % 2 != 0):
printx(n)
else:
if (n % 4 != 0):
printx(n // 2)
printx(n // 2)
else:
printx(n // 2)
printo(n // 2)

print()

# extra lower middle for even
if (n % 2 == 0):
print(” “, end = “”)
printx(n // 2)
print()

# lower half
p = 1

if (n % 2 == 0):
x-=1
p = 2

q = x // 2

# one line for each iteration
for i in range(1, x + 1):
for j in range(1, p + 1):
print(” “, end = “”)

printx(q)

if (i % 2 == 0):
q -= 1

print()

p += 1

print()

# Driver code
n = 7
printPattern(n)
n = 8
printPattern(n)

# This code is contributed by mohit kumar

C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to Print symmetric 
// double triangle pattern
using System;
class GFG
{
          
    // print alternate x o beginning with x
    static void printx(int n)
    {
        for (int i = 1; i <= n; i++) {
            if (i % 2 != 0)
                Console.Write("x ");
            else
                Console.Write("o ");
        }
        return;
    }
      
    // print alternate x o beginning with o
    static void printo(int n)
    {
        for (int i = 1; i <= n; i++) {
            if (i % 2 != 0)
                Console.Write("o ");
            else
                Console.Write("x ");
        }
        return;
    }
      
    // print the pattern for n
    static void printPattern(int n)
    {
        // upper half n-1 lines for
        // odd, n-2 lines for even
        int x = n;
      
        if (n % 2 == 0)
            x = x - 1;
      
        // number of spaces to leave in each line
        int p = n - 1;
      
        // number of characters in each line
        int s = 1;
      
        // prints double lines in each iteration
        for (int i = 1; i <= (x - 1) / 2; i++) {
            for (int j = 1; j <= p; j++) {
                Console.Write(" ");
            }
      
            if (i % 2 != 0)
                printx(s);
            else
                printo(s);
      
            Console.WriteLine();
            p++;
      
            for (int j = 1; j <= p; j++) 
                Console.Write(" ");     
      
            if (i % 2 != 0)
                printx(s);
            else
                printo(s);
      
          Console.WriteLine();
      
            p--;
            s++;
        }
      
        // extra upper middle for even
        if (n % 2 == 0) {
            for (int i = 1; i <= p; i++)
                Console.Write(" ");
      
            if (n % 4 != 0)
                printx(n / 2);
            else
                printo(n / 2);
      
            Console.WriteLine();
        }
      
        // middle line
        if (n % 2 != 0) 
            printx(n);
          
        else {
            if (n % 4 != 0) {
                printx(n / 2);
                printx(n / 2);
            }
            else {
                printx(n / 2);
                printo(n / 2);
            }
        }
      
          Console.WriteLine();
      
        // extra lower middle for even
        if (n % 2 == 0) {
            Console.Write(" ");
            printx(n / 2);
            Console.WriteLine();
        }
      
        // lower half
        p = 1;
      
        if (n % 2 == 0) {
            x--;
            p = 2;
        }
      
        int q = x / 2;
      
        // one line for each iteration
        for (int i = 1; i <= x; i++) {
            for (int j = 1; j <= p; j++)
                Console.Write(" ");
      
            printx(q);
      
            if (i % 2 == 0)
                q--;
      
            Console.WriteLine();
      
            p++;
        }
      
        Console.WriteLine();
    
      
    // Driver code
    public static void Main ()
    {
        int n = 7;
        printPattern(n);
          
        n = 8;
        printPattern(n);
    }
}
  
  
// This code is contributed by vt_m.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to Print symmetric 
// double triangle pattern
  
// print alternate x o 
// beginning with x
function printx($n)
{
    for ($i = 1; $i <= $n; $i++) 
    {
        if ($i % 2 != 0)
            echo "x ";
        else
            echo "o ";
    }
    return;
}
  
// print alternate x o 
// beginning with o
function printo($n)
{
    for ($i = 1; $i <= $n; $i++) 
    {
        if ($i % 2 != 0)
            echo "o ";
        else
            echo "x ";
    }
}
  
// print the pattern for n
function printPattern($n)
{
    // upper half
    // n-1 lines for odd, 
    // n-2 lines for even
    $x = $n;
  
    if ($n % 2 == 0)
        $x = $x - 1;
  
    // number of spaces to 
    // leave in each line
    $p = $n - 1;
  
    // number of characters 
    // in each line
    $s = 1;
  
    // prints double lines
    // in each iteration
    for ($i = 1; $i <= ($x - 1) / 2; $i++)
    {
        for ($j = 1; $j <= $p; $j++) 
        {
            echo " ";
        }
  
        if ($i % 2 != 0)
            printx($s);
        else
            printo($s);
  
        echo "\n";
        $p++;
  
        for ($j = 1; $j <= $p; $j++) 
            echo " "
  
        if ($i % 2 != 0)
            printx($s);
        else
            printo($s);
  
        echo "\n";
  
        $p--;
        $s++;
    }
  
    // extra upper middle
    // for even
    if ($n % 2 == 0) {
        for ($i = 1; $i <= $p; $i++)
            echo " ";
  
        if ($n % 4 != 0)
            printx($n / 2);
        else
            printo($n / 2);
  
        echo "\n";
    }
  
    // middle line
    if ($n % 2 != 0) 
        printx($n);
      
    else {
        if ($n % 4 != 0) 
        {
            printx($n / 2);
            printx($n / 2);
        }
        else {
            printx($n / 2);
            printo($n / 2);
        }
    }
  
    echo "\n";
  
    // extra lower middle for even
    if ($n % 2 == 0) {
        echo " ";
        printx($n / 2);
        echo "\n";
    }
  
    // lower half
    $p = 1;
  
    if ($n % 2 == 0) 
    {
        $x--;
        $p = 2;
    }
  
    $q = floor($x / 2);
  
    // one line for each iteration
    for ($i = 1; $i <= $x; $i++)
    {
        for ($j = 1; $j <= $p; $j++)
            echo " ";
  
        printx($q);
  
        if ($i % 2 == 0)
            $q--;
  
        echo "\n";
  
        $p++;
    }
  
    echo "\n";
}
  
    // Driver code
    $n = 7;
    printPattern($n);
    $n = 8;
    printPattern($n);
      
// This code is contributed by mits
?>

chevron_right


Output:

      x 
       x 
      o x 
       o x 
      x o x 
       x o x 
x o x o x o x 
 x o x 
  x o x 
   x o 
    x o 
     x 
      x 

       x 
        x 
       o x 
        o x 
       x o x 
        x o x 
       o x o x 
x o x o o x o x 
 x o x o 
  x o x 
   x o x 
    x o 
     x o 
      x 
       x 

The time complexity of the above program is O(N^2).
This article is contributed by Satish Srinivas. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



My Personal Notes arrow_drop_up