打印对称双三角图案
给定一个值 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