利用規約の変更について

偶数次魔方陣の場合、規則性がないと言われていますが、やはりないのでしょうか?
今4次、6次、8次、の三つだけだせれば良いのですが、処理は全て共通という訳にはいかずに、やはりif文やswitch文などで別々に作らなければいけないのでしょうか?
共通があればそのプログラムを、なければ別々のプログラムも参考にさせて頂きたいと考えています。
よろしくお願いします。

A 回答 (2件)

「全部求める」わけじゃないと仮定して:


4の倍数次のものは簡単で, かつ規則性もあります.
4の倍数でない偶数次だと面倒. それなりに方法はありますが.

参考URL:http://www.geocities.jp/ikuro_kotaro/koramu/264_ …
    • good
    • 0

私の持ってる資料(アルゴリズム辞典)でも簡単な解法がないと書かれていました。


前述の資料では、4次のものをぶんまわし(回転・反転を除くための処理はする)で解いていました。
しかし、8次だとキツイっすね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q配列を使って魔方陣

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

まだまだ初心者なので詳しく教えていただけると嬉しいです。よろしくお願いします。

C言語を使って最近やっと配列ができるようになってきたんですが、どうしても魔方陣のやり方がわからないんです。教えてください。

魔方陣とは、1~n^2までの整数をn×nの正方形に並べ、どの行、どの列、どの対角線のn個の数の和も一定の値になるようにしたものです。
nは常に奇数を入力し、1番上の行の中央の列に1を置く事になります。
整数kまで置かれているとすると、k+1は次のように置かれる。
* kの置かれた場所の右斜め上(以下この場所をαと呼ぶ)が空いていれば、そこにk+1を置...続きを読む

Aベストアンサー

次のコードでできると思います。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;
}

次のコードでできると思います。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...続きを読む


人気Q&Aランキング

おすすめ情報