C言語 魔方陣
/* 5x5の魔方陣を出力する。 魔方陣とは、正方形のnxnのマス目に1〜n^2の数値を埋めて縦、横、斜めの各列の和が全ておなじになるように設定したもの。nは3以上の奇数である。 「C言語による最新アルゴリズム事典」奥村晴彦 技術評論社 によれば 「n次(nxn)の魔方陣とは、1からn^2までの整数を正方形状に並べて、どの行の和も、どの列の和も、どちらの対角線の和も(n^3+n)/2に等しくなるようにしたものである。たとえば3次の魔方陣は 294 753 618 ("憎しと思へど七五三,..."). 魔法陣と書くのは誤り。nが奇数のときは簡単な構成法があるが、偶数次の魔方陣は一般的な解法がないようである。」引用終 -処理方法- ①魔方陣を0クリアする。 ②0列目の中央の行に1を入れる。 ③2からnxnまで数を順番に、以下の④から⑥の手順で入れていく。 ④最後に入れた位置の左斜め上の位置を候補位置とする。 ⑤候補位置が欄外の場合 列が欄外の場合は候補行の最終列を候補位置とする。 行が欄外の場合は候補列の最終行を候補位置とする。 ⑥④か⑤で求めた位置に何も設定されていなければ、その一に数字を入れる。 既にその位置に数字が設定されていたならば、最後に数値を入れた位置の右の位置に数値を入れる。 ⑦魔方陣がすべて埋まったら魔方陣を出力する。 */ #include <stdio.h> #include <string.h> int main() { int n = 5, i = 2, j = 0, k = 1; int d[5][5] = { 0 }; d[i][j] = k; for (k = 2; k < n * n + 1; k++) { if (j == 0) { if (i > 0 && d[i - 1][n - 1] == 0) { d[i - 1][n - 1] = k; i--; j = n - 1; } else { d[i][j + 1] = k; j++; } } else if (i == 0) { if (d[n - 1][j - 1] == 0) { d[n - 1][j - 1] = k; i = n - 1; j--; } else { d[i][j + 1] = k; j++; } } else if (d[i - 1][j - 1] == 0) { d[i - 1][j - 1] = k; i--; j--; } else { d[i][j + 1] = k; j++; } } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { printf("%3d", d[i][j]); } printf("\n"); } }
- 作者: 大森清美
- 出版社/メーカー: 日本評論社
- 発売日: 2013/08/03
- メディア: 単行本
- この商品を含むブログを見る
- 作者: 佐藤健一
- 出版社/メーカー: かんき出版
- 発売日: 2008/07/28
- メディア: 単行本(ソフトカバー)
- クリック: 10回
- この商品を含むブログを見る