📜  打印对称双三角图案

📅  最后修改于: 2022-05-13 01:57:59.121000             🧑  作者: Mango

打印对称双三角图案

给定一个值 n,我们需要相应地打印以下模式,只使用恒定的额外空间。
例子:

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 

我们可以将这个问题分为 3 个部分:
1) 上半部分打印 n-1 行表示奇数 n 或 n-2 行表示偶数 n。
2) 打印中间行,奇数 n 打印 1 行,偶数 n 打印 3 行。
3) 打印下半部分,奇数 n 行 n-1 行,偶数 n 行 n-2 行。
对于如此复杂的模式,如果我们可以使用基于 1 的索引可能会更容易
和单独的函数来打印以 x 或 o 开头的字符。

C++
// Author:: Satish Srinivas
#include 
 
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
C#] 


Javascript


输出:

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