【C#】パスカルの三角形を色々な配列で作ってみる

# パスカルの三角形とは

https://contest.japias.jp/tqj20/200170F/pascul-nature.html

これをプログラムで作ってみましょう。

# 環境
.NET8

## 2次元配列 `int[,]`
2次元配列（`int[,]`）を使用してパスカルの三角形を作成します。この場合、三角形の形状に合わせて行と列をループで処理し、値を計算します。
```c#
static void Main()
{
    var num = 5;

    var result = GeneratePascalsTriangleMatrix(num);

    for (int i = 0; i < result.GetLength(0); i++)
    {
        for (int j = 0; j < result.GetLength(1); j++)
        {
            // あえて0も出力
            // if (result[i, j] != 0)
            // {
                Console.Write(result[i, j]);
            // }
        }
        Console.WriteLine();
    }
}

static int[,] GeneratePascalsTriangleMatrix(int num)
{
    var matrix = new int[num, num];
    for (var i = 0; i < num; i++)
    {
        for (var j = 0; j <= i; j++)
        {
            if (j == 0 || j == i)
            {
                matrix[i, j] = 1;
            }
            else
            {
                matrix[i, j] = matrix[i - 1, j - 1] + matrix[i - 1, j];
            }
        }
    }
    return matrix;
}
```

```text
10000
11000
12100
13310
14641
```

## ジャグ配列 `int[][]`
次に、ジャグ配列（`int[][]`）を使用してパスカルの三角形を作成します。ジャグ配列は、各行の長さを動的に変更できる配列構造です。
```c#
static void Main()
{
    var num = 5;

    var result = GeneratePascalsTriangleJaggedArray(num);

    foreach (var row in result)
    {
        foreach (var value in row)
        {
            Console.Write(value);
        }
        Console.WriteLine();
    }
}

    static int[][] GeneratePascalsTriangleJaggedArray(int num)
{
    int[][] jaggedArray = new int[num][];
    for (int i = 0; i < num; i++)
    {
        jaggedArray[i] = new int[i + 1];
        for (int j = 0; j <= i; j++)
        {
            if (j == 0 || j == i)
            {
                jaggedArray[i][j] = 1;
            }
            else
            {
                jaggedArray[i][j] = jaggedArray[i - 1][j - 1] + jaggedArray[i - 1][j];
            }
        }
    }
    return jaggedArray;
}
```



```text
1
11
121
1331
14641
```

# 可変長配列 `List<List<int>>`
最後に、`List<List<int>>` を使用して作成します。
```c#
static void Main()
{
    var num = 5;

    var result = GeneratePascalsTriangleList(num);

    foreach (var row in result)
    {
        foreach (var value in row)
        {
            Console.Write(value);
        }
        Console.WriteLine();
    }
}

static List<List<int>> GeneratePascalsTriangleList(int num)
{
    var list = new List<List<int>>();
    for (int i = 0; i < num; i++)
    {
        var row = new List<int>();
        for (int j = 0; j <= i; j++)
        {
            if (j == 0 || j == i)
            {
                row.Add(1);
            }
            else
            {
                row.Add(list[i - 1][j - 1] + list[i - 1][j]);
            }
        }
        list.Add(row);
    }
    return list;
}
```

```text
1
11
121
1331
14641
```

# 気をつけること
1. 多次元配列とジャグ配列は別物

    - 主に静的型付け言語では、多次元配列（int[,]）とジャグ配列（int[][]）は別物です
初期化や扱い方が異なるため、コードを書く際に注意してください。
1. プラットフォームによる仕様の違い
    - 動的型付け言語（例: Python、JavaScript）では「ジャグ配列」の概念はありません。リストや配列がそのままジャグ配列のように振る舞います
    - 静的型付け言語（例: C#、Java）では、明確に「多次元配列」と「ジャグ配列」を区別する必要があります

1. 競技プログラミングでの注意点
    - 言語仕様が違う場合、問題文中では「2次元配列」と書いてあっても、ジャグ配列の形式を要求されることがあります
    - 提出コードで意図通りに動作しない場合は、配列の形状を再確認しましょう