• ベストアンサー

配列を使って魔方陣

C言語を使って最近やっと配列ができるようになってきたんですが、どうしても魔方陣のやり方がわからないんです。教えてください。 魔方陣とは、1~n^2までの整数をn×nの正方形に並べ、どの行、どの列、どの対角線のn個の数の和も一定の値になるようにしたものです。 nは常に奇数を入力し、1番上の行の中央の列に1を置く事になります。 整数kまで置かれているとすると、k+1は次のように置かれる。 * kの置かれた場所の右斜め上(以下この場所をαと呼ぶ)が空いていれば、そこにk+1を置く。 * αがすでに他の数が置かれているとき、kの置かれている場所のすぐ下にk+1を置く。 * αが右上隅にはみ出す場合は、kの置かれている場所のすぐ下にk+1を置く。 * αが1番上の行からはみ出す場合は、場所αの1番下の列にk+1を置く。 * αが1番右上の列からはみ出す場合には、場所αの1番左の列にk+1を置く。 例)n=3のとき 8 1 6 3 5 7 4 9 2 まだまだ初心者なので詳しく教えていただけると嬉しいです。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • gimmick
  • ベストアンサー率49% (134/270)
回答No.1

次のコードでできると思います。n=19までは大丈夫そうでした。インデントに全角スペースを使っているので適当に置換してください。 ------------------------------------------------- #include<stdio.h> #define SIZE 5 /*奇数を指定*/ int mahoujin[SIZE][SIZE]; int sum_yoko[SIZE], sum_tate[SIZE], sum_naname[2]; int main() {   int i, j;   int row, col;   /*初期化*/   row = 0;   col = SIZE / 2;   mahoujin[row][col] = 1;   /*配列への書き込み*/   for (i = 2; i <= (SIZE * SIZE); i++) {     if (row == 0 && col >= (SIZE -1))       row++;     else if (row == 0)       row = (SIZE - 1), col++;     else if (col >= (SIZE -1))       row--, col = 0;     else if (mahoujin[row - 1][col + 1] == 0)       row--, col++;     else       row++;     mahoujin[row][col] = i;   }   /*検証*/   for (i = 0; i < SIZE; i++) {     for (j = 0; j < SIZE; j++) {       sum_yoko[i] += mahoujin[i][j]; /*横方向の合計を各行について計算*/       sum_tate[i] += mahoujin[j][i]; /*縦方向の合計を各列について計算*/     }     sum_naname[0] += mahoujin[i][i]; /*左上から右下への合計*/     sum_naname[1] += mahoujin[i][SIZE - 1 - i]; /*右上から左下への合計*/   }   for (i = 0; i < SIZE; i++) {     if (sum_yoko[i] != sum_naname[0] || sum_tate[i] != sum_naname[0]) {       printf("魔方陣の生成に失敗しました\n");       return 0;     }   }   if (sum_naname[0] != sum_naname[1]) {     printf("魔方陣の生成に失敗しました\n");     return 0;   }   /*画面出力*/   printf("サイズ%dの魔方陣\n", SIZE);   for (i = 0; i < SIZE; i++) {     for (j = 0; j < SIZE; j++)       printf("%4d", mahoujin[i][j]);     printf("\n");   }   return 0; }

osiato
質問者

お礼

とても詳しい回答ありがとうございます。 自分で作ったプログラムは検証のところが旨くいってなかったみたいです。 これを参考にしながらもう1度プログラムしてみたいと思います。 大変ありがとうございました。

その他の回答 (2)

noname#4564
noname#4564
回答No.3

ついでに、「作成したプログラムにバグがないことをどうやって検証するか」考えるとよいでしょう。 プログラムの書き方はたんなる出発点に過ぎません。 効率のよいテスト方法を考えることは、よい勉強になります。

osiato
質問者

お礼

バグ・・・ですか。 プログラムを作成して実行すると、いつもエラーが出ていたのは検証してなかったせいなんですね。 もっと勉強したいと思います。 再回答ありがとうございました。

noname#4564
noname#4564
回答No.2

  プログラムの実装以前に、魔方陣の作り方(数学的な意味での「解法」)を確認しなければ、正しいコードを書けません。 数学の教科書、参考書等で確認してみてください。  

osiato
質問者

お礼

こんにちは。 魔方陣の作り方は紙に何度も書いて確認しているのですが、いざプログラムというとわからなくなってしまうんです。 それは私の力不足という訳で・・・(^^; 回答ありがとうございました。

関連するQ&A