なんてことないけど出力結果に感動したのでメモ。
問題概要
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; }