読者です 読者をやめる 読者になる 読者になる

hogecoder

つたじろう(Tsuta_J) 競技プログラミングの記録

AOJ 0078: Magic Square

AOJ

なんてことないけど出力結果に感動したのでメモ。

問題概要

原文 → 魔方陣 | Aizu Online Judge

nを3以上15以下の奇数とする。n * nの魔方陣を出力せよ。 (魔方陣の作り方は原文参照)

解説

実装自体はやるだけです。でも15 * 15の魔方陣とか作れて楽しい。配列のサイズをdefineで変えて遊ぶともっと楽しい。

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a; i<n; i++)
#define MAX_N 15
int ans[MAX_N][MAX_N];
int n;
int i, j;

void solve(int x, int y, int k) {
    if(0 <= x && x < n && 0 <= y && y < n) {
        if(ans[x][y] == -1) {ans[x][y] = k; i = x; j = y; return;}
        else solve(x+1,y-1,k);
    }
    else if(x >= n) solve(0,y,k);
    else if(y >= n) solve(x,0,k);
    else if(y < 0) solve(x,n-1,k);
}

int main() {
    while(cin >> n) {
        memset(ans, -1, sizeof(ans));
        int mid = n / 2;
        i = mid + 1; j = mid;
        ans[i][j] = 1;

        rep(k,2,n * n + 1) solve(i+1, j+1, k);

        rep(i,0,n) {
            rep(j,0,n) {
                printf("%4d", ans[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}