• ベストアンサー

偶数次魔方陣のプログラム

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

noname#22157
noname#22157

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「全部求める」わけじゃないと仮定して: 4の倍数次のものは簡単で, かつ規則性もあります. 4の倍数でない偶数次だと面倒. それなりに方法はありますが.

参考URL:
http://www.geocities.jp/ikuro_kotaro/koramu/264_magic3.htm

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

私の持ってる資料(アルゴリズム辞典)でも簡単な解法がないと書かれていました。 前述の資料では、4次のものをぶんまわし(回転・反転を除くための処理はする)で解いていました。 しかし、8次だとキツイっすね。

関連するQ&A

  • 魔方陣のつくりかた

    JAVAを習い始めの初心者です。夏休みの宿題で「5×5の魔方陣を2次配列を使って作りましょう」という事なのですが、さっぱりです。問題は、 (1)全てのます目に0を代入し、0列の真中に1を入れる。 (2)最後に入れた位置の左斜め上の位置を候補位置とする。候補位置が欄外になる場合は、欄外にも魔方陣があるものと考え、対応する位置を候補位置とする。 (3)既に数字が設定されたいたら最後に入れた位置の右の位置に数字をいれる。 助けてください。よろしくお願いします。

  • 奇数魔方陣

    下記のプログラム(奇数魔方陣) について最初のfor文からどのような処理が行われているかわかりません。 { int mahoujin[10][10],x,y,i,n = 7; x = n / 2 + 1; y = 1; mahoujin[x][y] = 1; for( i = 2; i <= n * n; i++ ){ if( i % n == 1 ){ y = y + 1; }else{ x = x + 1; y = y - 1; } if( x > n ) x = 1; if( y < 1 ) y = n; mahoujin[x][y] = i; } for( y = 1; y <= n; y++ ){ for( x = 1; x <= n; x++ ){ printf( "%3d ", mahoujin[x][y] ); } printf( "\n" ); } 特にわからないのがif文で分岐になるところどのようなことが行われているかがわからないです。どなたか教えて頂けるとうれしいです。

  • 5×6の魔方陣について

    弟の冬休みの宿題の中に紛れ込んでいた問題について、分からなかったので兄の威信のためにご協力ください。 問題をテキストの通り載せます。 問  2 3 6 7 9 だけを使い、縦、横、ななめの合計が全て27になるように、下の魔方陣を完成させてください。 添付データのようにすでに5箇所に数字が書き込まれています。問題文の説明が正直分かりにくいのですが、縦が六マスあるので、数字は指定されているものならば何度も使用できると考えられます。 ただ、「ななめ」にかんしては、意味が分からなかったので5マス数えられる4箇所を27にすればいいのではないかと考えています。4マスや3マスでも27に出来ますが、間違いなく矛盾が起こってしまい崩壊してしまいますので無視することにしました。……恐らくですが。 エクセルで色々いじってみたのですが、分からなくなってしまいました。 ななめの意味が分からない、無理だ、と言う場合、よろしければ縦と横だけでも結構ですのでご協力おねがいします。

  • ラテン方陣に関して

    1 2 3 4 5 2 3 4 5 1 3 4 5 1 2 4 5 1 2 3 5 1 2 3 4 のように、縦、横、同じ数が一度しか出でこない方陣を「ラテン方陣」と言うそうです。通常の「魔方陣」とは違って、「ラテン方陣」の場合、縦・横は絶対に合計が同じになりますが、対角の合計は同じでなくても、いいみたいです。 今、9 × 9 のラテン方陣が、全部で何通り、存在するのかや、それをコンピューターやソフトかなにかで、簡単に計算することができるのか、そういうことを頼める業者はないものなのかで、とても困っています。 9 × 9 のラテン方陣とは 1 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 1 3 4 5 6 7 8 9 1 2 4 5 6 7 8 9 1 2 3 5 6 7 8 9 1 2 3 4 6 7 8 9 1 2 3 4 5 7 8 9 1 2 3 4 5 6 8 9 1 2 3 4 5 6 7 9 1 2 3 4 5 6 7 8 ですが、この方陣の行と列をどのように入れ替えても、ラテン方陣、縦・横、同じ数字は一度しか出てこないラテン方陣ができ、その数は、きっと、ものすごい数のパターンがあると思います。 順番が1 2 3 4 5 6 7 8 9 でなくても、 1 3 5 7 9 2 4 6 8 3 5 7 9 2 4 6 8 1 5 7 9 2 4 6 8 1 3 7 9 2 4 6 8 1 3 5 9 2 4 6 8 1 3 5 7 2 4 6 8 1 3 5 7 9 4 6 8 1 3 5 7 9 2 6 8 1 3 5 7 9 2 4 8 1 3 5 7 9 2 4 6 のようなものもあります。 このようなラテン方陣を作成できるソフトや、何通りあるのかを調べるには、一体、どうしたらいいのでしょうか。 最後にもう一つだけお願いしたいのですが、とりあえずのところ、1 2 3 4 5 6 7 8 9という9個の数字の並べ方が、何通りあるのか、どなたか教えて下さい。 9の ! (階乗)で計算するのでしょうか?

  • if文を使わずに奇数・偶数を判断

    はじめまして。C言語解説サイトを巡ってみたのですが、if文無しの奇数偶数判断にまで辿りつかず頭を抱えています。 任意の数字を(指定回数分)打ち込み、奇数だった場合のみ加算し合計を表示するというプログラムを作成したいのですが色々と規制がかかっており、if文・switch文は使用不可/ループも1回のみとなっています。 if文を使えれば x%2 == 1 で奇数と判断できるのですが・・・。 ■ if文を使わず奇数・偶数かを判断→加算 の流れ を是非教えて頂きたいです。お時間ありましたらご教授よろしくお願い致します。

  • エクセルのVBAでの7×7の魔方陣とは……

    講義の宿題で7×7の魔方陣をVBAで解いてこいといわれました。 しかしながら自分のスキルではどうにもなりませんでした。 自分はIFやDim等までしか習っていません。 課題の注意点としては 1から49までの数値を検出 「1」は1行目の中央(4列目)に書き出す 基本的に、数値の書き出す順番は斜め上に移動 また、書き込む数値を「7」で割った場合の余りが「1」の時 書き込みの場所は下方向に移動する。 枠をはみ出した場合   上にはみ出した(行)の場合  7行目に   右にはみ出した(列)の場合  1列目に  それぞれ移動 以上のような条件でエクセルのVBEを用いて解きたいのですが、どうにも分かりません。自分でも様々なサイトで調べてみたところどれも難しすぎて理解できませんでした。 心優しき方は教えていただけると幸いです。 よろしくお願いします。

  • PHPで偶数と奇数を判断するには

    宜しくお願いします。 一覧表示等をする時に見やすいように一行ずつテーブルの色を変えたりすると思うのですが、これをPHPのfor文で自動的に交互に色を変えるようなプログラムを作ろうと思っております。for文で繰り返し処理場合、例えば、 for($n = 0; $n < 100; $n++) {  if($n = 偶数)  {  $bgcolor = "#ff0000";  }  elseif($n = 奇数)  {  $bgcolor = "#0000ff";  } } といった形で交互に色を変るには、偶数/奇数の判断が出来ないと無理だと思うのですが、何か良い方法は無いでしょうか?

    • ベストアンサー
    • PHP
  • 奇数と偶数をそれぞれ足していく:python

    私は、今プログラミングの勉強をしています。そこでfor,if,wheleを使ったプログラムの練習として奇数と偶数をそれぞれ足していくプログラムを作ろうとしているのですが思うように行きません。そのためpythonでこのプログラムを書いていただけないでしょうか。 どうかよろしくお願いします。 仕様としては、下記のようです。 数値を入力してください。 10 奇数:1、偶数:2 奇数:3、偶数:4    ・   ・      ・   ・    ・   ・ 奇数の合計:25、偶数の合計:30 こんな感じのイメージです。

  • こういうプログラムって?

    iseven(num) Func If remain(num,2)=0 Then Return Else  Return Flase End If EndFunc 以上のようなNが2で割れるときのみTrueと表示するプログラム なんですけど このプログラムにおいて(num,2)=0って どういう意味なんでしょうか? numが自然数ってのがネットで調べてわかっただけですm(__)m それとIF THENを利用して 偶数のみの和や積を求めるプログラムの 文がわからないのでどなたか教えてください。

  • 偶数パリティ

    引数で渡されたデータの最上位ビット偶数パリティを付加する以下の関数について、空欄(1)~(3)に入る値または式について、考えているのですが、どうしても分かりません。自分なりに出した回答について、ご指摘や解説をいただければと思います。 void AddParity(unsigned int :src) { int bit; int cnt; int i; bit = sizeof(int) : { (1) }; for (i = 0, cnt = 0;{ (2) }; i++){ if (*src & (1 << i)) cnt++; } if (cnt & 1) *src |= 1 << (bit -1); else *src{ (3) } ~(1 << (bit -1)); } (1)について 変数「bit」の初期値設定ですが、sizeof関数に何を乗じるのか分かりません。 (2)について for文の条件についてですが、「cnt < ??」 だとは思うんですが、??が分かりません。 (3)について シフト演算で、偶数パリティを付加する処理だろうとは思うんですが、 何が入るのか分かりません・・・

専門家に質問してみよう