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");
	}
}

魔方陣の世界

魔方陣の世界

アタマスッキリ魔方陣

アタマスッキリ魔方陣