Problem:
魔方陣

n × n の正方形のマス目の中に数字の１から n × n が一つずつ入っていて、縦のどの列のマス目の和も、横のどの列のマス目の和も対角線のマス目の和も等しいものを魔方陣といいます。

一辺のマスの個数が奇数の魔方陣の作り方には以下の方法があります。

中央のマス目のちょうど一つ下のマス目に１を入れる。

次の数字を右斜め下のマス目に入れる。
ただし、数字を入れようとしたマス目が正方形からはみ出している場合、すでに数字が埋まっている場合は以下の方法に従って数字を入れるマス目を探す。

右にはみ出した場合には、同じ行の左はしに、左にはみ出した場合には、同じ行の右はしに、下にはみ出した場合には、同じ列の一番上に数字を入れる。

数字を入れようとしたマス目が埋まっているときには、その埋まっているマス目の左斜め下のマス目に入れる。

全てのマス目が埋まるまで２を繰り返す。

この方法に従って、一辺のマス目の個数 n を入力として、その大きさの魔方陣を出力するプログラムを作成して下さい。ただし、n は 3 以上 15 以下の奇数とします。マス目に入る各数字は右詰 4 桁で出力してください。

入力

複数の入力が与えられます。各入力で n （正の整数）が１行に与えられます。入力は 0 で終了します。入力の数は 10 を超えません。

出力

各入力に対して n × n の魔方陣を出力して下さい。

Sample Input

3
5
0

Output for the Sample Input

4 9 2
3 5 7
8 1 6
11 24 7 20 3
4 12 25 8 16
17 5 13 21 9
10 18 1 14 22
23 6 19 2 15

Solution in JAVA (judge verdict: Accepted)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;

public class Main {
	public static void main(String[] args){
		BigDecimal one = new BigDecimal("1.00");
		int[] abo = {0,0,0,0};
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String tmp = null;
		int cup = 0;
		int mun = 0;
		int ter = 0;
		String[] rrr;
		int st = 0,sr = 0;
		double mon = 0;
		int syo=0,hisi=0;
		double aaaa = 1;
		
		
		while(true){
			
			try {
				tmp = br.readLine();
			} catch (IOException e) {
				// TODO 自動生成された catch ブロック
				e.printStackTrace();
			}
			
			if(tmp == null){
				break;
			}
			
			if(tmp.equals("")){
				break;
			}
			
			st = Integer.parseInt(tmp);
			
			if(st == 0){
				break;
			}
			
			int[][] eee = new int[st][st];
			
			for(int i=0;i<st;i++){
				for(int j=0;j<st;j++){
					eee[i][j] = -1;
				}
			}
			
			eee[(st/2)+1][st/2] = 1;
			
			int[] vn = new int[2];
			vn[0] = st/2;
			vn[1] = st/2;
			vn[0]++;
			vn[0]++;
			vn[1]++;
			for(int i=2;i<st*st+1;i++){
				
				saiki(eee,vn,i);
				vn[0]++;
				vn[1]++;
				
			}
			
			
			for(int i=0;i<st;i++){
				for(int j=0;j<st;j++){
					System.out.printf("%4d",eee[i][j]);
				}
				System.out.println();
			}
			
		}
		
	}
	public static void saiki(int[][] eee, int[] vn,int s){
		
		
		if(vn[1] >= eee.length){
			vn[1] = 0;
		}else if(vn[1] < 0){
			vn[1] = eee.length -1;
		}else if(vn[0] >= eee.length){
			vn[0] = 0;
		}else if(eee[vn[0]][vn[1]] != -1){
			vn[0]++;
			vn[1]--;
		}else{
			eee[vn[0]][vn[1]] = s;
			return;
		}
		
		saiki(eee,vn,s);
	}

}