Open In App
Related Articles

Print symmetric double triangle pattern

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Report issue
Report

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




 



Last Updated : 01 Mar, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads