Skip to content
Related Articles
Get the best out of our app
GeeksforGeeks App
Open App
geeksforgeeks
Browser
Continue

Related Articles

Print symmetric double triangle pattern

Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article

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++




// 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;
}

Java




// 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.

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

Javascript




<script>
      // JavaScript program to Print symmetric
      // double triangle pattern
      // print alternate x o beginning with x
      function printx(n) {
        for (var i = 1; i <= n; i++) {
          if (i % 2 !== 0) document.write("x  ");
          else document.write("o  ");
        }
        return;
      }
 
      // print alternate x o beginning with o
      function printo(n) {
        for (var i = 1; i <= n; i++) {
          if (i % 2 !== 0) document.write("o  ");
          else document.write("x  ");
        }
        return;
      }
 
      // print the pattern for n
      function printPattern(n) {
        // upper half n-1 lines for
        // odd, n-2 lines for even
        var x = n;
 
        if (n % 2 === 0) x = x - 1;
 
        // number of spaces to leave in each line
        var p = n - 1;
 
        // number of characters in each line
        var s = 1;
 
        // prints double lines in each iteration
        for (var i = 1; i <= (x - 1) / 2; i++) {
          for (var j = 1; j <= p; j++) {
            document.write("  ");
          }
 
          if (i % 2 !== 0) printx(s);
          else printo(s);
 
          document.write("<br>");
          p++;
 
          for (var j = 1; j <= p; j++) document.write("  ");
 
          if (i % 2 != 0) printx(s);
          else printo(s);
 
          document.write("<br>");
 
          p--;
          s++;
        }
 
        // extra upper middle for even
        if (n % 2 === 0) {
          for (var i = 1; i <= p; i++) document.write("  ");
 
          if (n % 4 !== 0) printx(n / 2);
          else printo(n / 2);
 
          document.write("<br>");
        }
 
        // 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);
          }
        }
 
        document.write("<br>");
 
        // extra lower middle for even
        if (n % 2 === 0) {
          document.write("  ");
          printx(n / 2);
          document.write("<br>");
        }
 
        // lower half
        p = 1;
 
        if (n % 2 === 0) {
          x--;
          p = 2;
        }
 
        var q = x / 2;
 
        // one line for each iteration
        for (var i = 1; i <= x; i++) {
          for (var j = 1; j <= p; j++) document.write("  ");
 
          printx(q);
 
          if (i % 2 === 0) q--;
 
          document.write("<br>");
 
          p++;
        }
 
        document.write("<br>");
      }
 
      // Driver code
      var n = 7;
      printPattern(n);
 
      n = 8;
      printPattern(n);
    </script>

C#




// c# equivalent of above java code
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 (String[] args)
    {
        int n = 7;
        PrintPattern(n);
         
        n = 8;
        PrintPattern(n);
    }
}

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 

Time Complexity: O(N^2)

Auxiliary Space: O(1) because it is using constant space for variables

This article is contributed by Satish Srinivas. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@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
Last Updated : 01 Mar, 2023
Like Article
Save Article
Similar Reads
Related Tutorials