C#で魔法陣の作り方を勉強しています
3次魔法陣で、出力した場合に何通りのパターンがあるか調べるプログラミングを書いているのですが
チャットGPTに聞いたら以下の回答を得ました
C#
1using System; 2 3class MagicSquareGenerator 4{ 5 static void Main() 6 { 7 Console.WriteLine("3x3 魔法陣の解:"); 8 9 // 9つの数字をすべての組み合わせでループ(多重forループ) 10```ここに言語を入力 11 for (int a = 1; a <= 9; a++) 12 for (int b = 1; b <= 9; b++) if (b != a) 13 for (int c = 1; c <= 9; c++) if (c != a && c != b) 14 for (int d = 1; d <= 9; d++) if (d != a && d != b && d != c) 15 for (int e = 1; e <= 9; e++) if (e != a && e != b && e != c && e != d) 16 for (int f = 1; f <= 9; f++) if (f != a && f != b && f != c && f != d && f != e) 17 for (int g = 1; g <= 9; g++) if (g != a && g != b && g != c && g != d && g != e && g != f) 18 for (int h = 1; h <= 9; h++) if (h != a && h != b && h != c && h != d && h != e && h != f && h != g) 19 for (int i = 1; i <= 9; i++) if (i != a && i != b && i != c && i != d && i != e && i != f && i != g && i != h) 20 21 { 22 // 3×3 配列に数値を配置 23 int[,] square = { 24 { a, b, c }, 25 { d, e, f }, 26 { g, h, i } 27 }; 28 29 // 魔法陣の条件をチェック 30 if (IsMagicSquare(square)) 31 { 32 // 魔法陣を出力 33 PrintSquare(square); 34 } 35 } 36 } 37 38 // 魔法陣の条件を満たすかチェックする関数 39 static bool IsMagicSquare(int[,] a) 40 { 41 int sum = 15; 42 43 // 各行の和 44 for (int i = 0; i < 3; i++) 45 if (a[i, 0] + a[i, 1] + a[i, 2] != sum) return false; 46 47 // 各列の和 48 for (int j = 0; j < 3; j++) 49 if (a[0, j] + a[1, j] + a[2, j] != sum) return false; 50 51 // 対角線の和 52 if (a[0, 0] + a[1, 1] + a[2, 2] != sum) return false; // 主対角線 53 if (a[0, 2] + a[1, 1] + a[2, 0] != sum) return false; // 副対角線 54 55 return true; 56 } 57 58 // 魔法陣を出力する関数 59 static void PrintSquare(int[,] square) 60 { 61 for (int i = 0; i < 3; i++) 62 { 63 for (int j = 0; j < 3; j++) 64 { 65 Console.Write(square[i, j] + " "); 66 } 67 Console.WriteLine(); 68 } 69 Console.WriteLine(); 70 }
総当たりで出力してもらいましした(再帰法は分からないので再帰法は使わない)
質問なのですが、以下の多重ループを実行していると、
C#
1 for (int a = 1; a <= 9; a++) 2 for (int b = 1; b <= 9; b++) if (b != a) 3 for (int c = 1; c <= 9; c++) if (c != a && c != b) 4 for (int d = 1; d <= 9; d++) if (d != a && d != b && d != c) 5 for (int e = 1; e <= 9; e++) if (e != a && e != b && e != c && e != d) 6 for (int f = 1; f <= 9; f++) if (f != a && f != b && f != c && f != d && f != e) 7 for (int g = 1; g <= 9; g++) if (g != a && g != b && g != c && g != d && g != e && g != f) 8 for (int h = 1; h <= 9; h++) if (h != a && h != b && h != c && h != d && h != e && h != f && h != g) 9 for (int i = 1; i <= 9; i++) if (i != a && i != b && i != c && i != d && i != e && i != f && i != g && i != h)
ここの動きの仕組みはよくわかりません。
最初のループではa~iまで1~9で出力されていて関数へ行きます(この流れは理解できます。)
そのあと、スッテプインで見ていると
for (int i = 1; i <= 9; i++) if (i != a && i != b && i != c && i != d && i != e && i != f && i != g && i != h)
に戻って処理をするのはなぜなのでしょうか?
このような場合、次数を少なくして考えた方が良い。
IF文がなければ
1 1
1 2
2 1
2 2
IF文があれば
1 2
2 1