質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

1回答

308閲覧

C# 魔法陣の作り方について

yuka11556

総合スコア2

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

1グッド

0クリップ

投稿2024/12/17 07:03

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)
に戻って処理をするのはなぜなのでしょうか?

tatsu99👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kikukiku

2024/12/18 04:04

このような場合、次数を少なくして考えた方が良い。 IF文がなければ  1 1  1 2  2 1  2 2 IF文があれば  1 2  2 1
guest

回答1

0

C#

1for (int a = 1; a <= 9; a++) 2{ 3 for (int b = 1; b <= 9; b++) 4 { 5 if (b != a) 6 { 7 for (int c = 1; c <= 9; c++) 8 { 9 if (c != a && c != b) 10 { 11 for (int d = 1; d <= 9; d++) 12 { 13 if (d != a && d != b && d != c) 14 { 15 for (int e = 1; e <= 9; e++) 16 { 17 if (e != a && e != b && e != c && e != d) 18 { 19 for (int f = 1; f <= 9; f++) 20 { 21 if (f != a && f != b && f != c && f != d && f != e) 22 { 23 for (int g = 1; g <= 9; g++) 24 { 25 if (g != a && g != b && g != c && g != d && g != e && g != f) 26 { 27 for (int h = 1; h <= 9; h++) 28 { 29 if (h != a && h != b && h != c && h != d && h != e && h != f && h != g) 30 { 31 for (int i = 1; i <= 9; i++) 32 { 33 if (i != a && i != b && i != c && i != d && i != e && i != f && i != g && i != h) 34 { 35 // 3×3 配列に数値を配置 36 int[,] square = { 37 { a, b, c }, 38 { d, e, f }, 39 { g, h, i } 40 }; 41 42 // 魔法陣の条件をチェック 43 if (IsMagicSquare(square)) 44 { 45 // 魔法陣を出力 46 PrintSquare(square); 47 } 48 } 49 } 50 } 51 } 52 } 53 } 54 } 55 } 56 } 57 } 58 } 59 } 60 } 61 } 62 } 63 } 64}

と中括弧とインデントをつければ分かりますかね?

投稿2024/12/17 07:18

YAmaGNZ

総合スコア10516

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問