#include <iostream>
using namespace std;
void MakeArray(int n, int ***arr);
void RemoveArray(int n, int ***arr);
void PrintArray(int n, int **arr);
void PrintReverseMidArray(int n, int **arr);
void PrintRightArray(int n, int **arr);
void Shape1(int n);
void Shape2(int n);
void Shape3(int n);
int main(void)
{
int n, m;
// 삼각형의 높이n과 종류m을 입력받는다.
cin >> n>>m;
// 예외 처리
if (n < 0 || n>30 || m < 0 || m>3)
return 0;
switch (m)
{
case 1:
Shape1(n);
break;
case 2:
Shape2(n);
break;
case 3:
Shape3(n);
break;
}
}
// 배열 동적 할당
void MakeArray(int n, int ***arr)
{
*arr = new int*[n];
for (int i = 0; i < n; ++i)
(*arr)[i] = new int[n];
// 배열의 원소 0으로 초기화
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
(*arr)[i][j] = 0;
// 삼각형 구하기
for (int i = 0; i < n; ++i)
{
for (int j = 0; j <= i; ++j)
{
if (j == 0)
(*arr)[i][j] = 1;
else if (j == i)
(*arr)[i][j] = 1;
else
(*arr)[i][j] = (*arr)[i - 1][j - 1] + (*arr)[i - 1][j];
}
}
}
// 동적 할당한 배열 제거
void RemoveArray(int n, int ***arr)
{
for (int i = 0; i < n; ++i)
delete[](*arr)[i];
delete[] *arr;
}
// 배열 좌상단 출력
void PrintArray(int n, int **arr)
{
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
if (arr[i][j] == 0)
cout << " ";
else
cout << arr[i][j] << ' ';
}
cout << endl;
}
}
// 배열을 뒤집고 가운데 정렬하여 출력
void PrintReverseMidArray(int n, int **arr)
{
for (int i = n-1; i >= 0; --i)
{
// 중간 정렬을 위해 앞부분에 공백 추가
for (int j = 1; j < n - i; ++j)
cout << ' ';
for (int j = 0; j < n; ++j)
{
if (arr[i][j] == 0)
cout << " ";
else
cout << arr[i][j] << ' ';
}
cout << endl;
}
}
// 배열 우하단 출력
void PrintRightArray(int n, int **arr)
{
for (int i = n - 1; i >= 0; --i)
{
for (int j = n - 1; j >= i; --j)
{
if (arr[j][i] == 0)
cout << " ";
else
cout << arr[j][i] << ' ';
}
cout << endl;
}
}
// 좌 상단에서 시작
void Shape1(int n)
{
int **arr = nullptr;
MakeArray(n, &arr);
PrintArray(n, arr);
RemoveArray(n, &arr);
}
// 하단 중간에서 시작
void Shape2(int n)
{
int **arr = nullptr;
MakeArray(n, &arr);
PrintReverseMidArray(n, arr);
RemoveArray(n, &arr);
}
// 우 하단에서 시작
void Shape3(int n)
{
int **arr = nullptr;
MakeArray(n, &arr);
PrintRightArray(n, arr);
RemoveArray(n, &arr);
}