import java.util.Scanner;
public class MagicSquare {
public static void main(String[] args) {
// TODO Auto-generated method stub
//幻和值
int n = input();
int sum = (n*n+1)*n/2;
int[][] a;
a=makeMS(n);
check(a, sum);
print(a);
}
static boolean rowSum(int[][] a,int sum0){
//各行的和等于幻和返回 true
System.out.print("行检查中");
int[] r = new int[a.length-2];
for(int i=1;i<a.length-1;i++){
int sum=0;
for(int j=1;j<a[i].length-1;j++){
sum += a[i][j];
}
r[i-1]=sum;
}
for(int i=0;i<r.length;i++){
if(sum0 == r[i]){
System.out.print(".");
}else{
System.out.println("第"+i+"行="+r[i]+",应为:"+sum0);
return false;
}
}
System.out.println();
return true;
}
static boolean columnSum(int[][] a,int sum0){
//各列的和等于幻和返回 true
System.out.print("列检查中");
int[] c = new int[a.length];
for(int i=1;i<a.length-1;i++){
int sum=0;
for(int j=1;j<a[i].length-1;j++){
sum += a[j][i];
}
c[i] =sum;
}
for(int i=1;i<c.length-1;i++){
if(sum0 == c[i]){
System.out.print(".");
}else{
System.out.println("第"+i+"列="+c[i]+",应为:"+sum0);
return false;
}
}
System.out.println();
return true;
}
static boolean diagonalSum(int[][] a,int sum0){
//对角线的和等于幻和返回 true
System.out.print("对角线检查中");
int[] d = new int[2];
int sum1=0;
int sum2=0;
for(int i=0;i<a.length;i++){
for(int j=0;j<a[i].length;j++){
if(i==j){
sum1 += a[i][j];
sum2 += a[a.length-1-i][j];
}
}
}
d[0] = sum1;
d[1] = sum2;
if( sum0==d[0] && sum0==d[1]){
System.out.println("..");
return true;
}else{
System.out.println("对角线有错,不是完美幻方!");
return false;
}
}
static boolean exist(int a){
if(0 != a)
return false;
return true;
}
/**
*
* @param n0 n0阶幻方维度,n0为奇数
* @return a 幻方
*/
static int[][] makeMS(int n0){
int n=n0;
//产生扩大的二维数组,多一圈零
int[][] a = new int[n+2][n+2];
//将数字1放在第一行中间列
int i=1;
int j=(n+2)/2;
a[1][j]=1;
//按规律填入2:n*n的自然数
for(int k=2;k<=n*n;k++){
//坐标移向右上角
i--;
j++;
//保存移动前的坐标
int posi=i+1;
int posj=j-1;
//横坐标移到第1行之前,需转到最后一行
if( i < 1 )
i=a.length-2;
//纵坐标移到最后一行之后,需转到第1行
if( j > a.length-2)
j=1;
//a[i][j]上未插入数字
if( exist(a[i][j]) ){
a[i][j]=k;
}else{
i=posi+1;
j=posj;
a[i][j]=k;
}
}
return a;
}
/**
*
* @param a 幻方
*/
static void print(int[][] a){
for(int i=1;i<a.length-1;i++){
for(int j=1;j<a[i].length-1;j++){
System.out.print(a[i][j]+"\t");
}
System.out.println();
}
}
/**
*
* @param a 幻方
* @param sum0 幻和
*/
static void check(int[][] a,int sum0){
if( rowSum(a,sum0) ){
System.out.println("行检查完毕!");
}
if( columnSum(a,sum0) ){
System.out.println("列检查完毕!");
}
if( diagonalSum(a,sum0) ){
System.out.println("对角线检查完毕!");
}
}
/**
* @return n 输入的奇数
*/
static int input(){
boolean flag=true;
while(flag){
System.out.println("请输入一个奇数:");
Scanner reader=new Scanner(System.in);
int n=reader.nextInt();
if( 1==(n%2)){
flag=false;
return n;
}else{
System.out.print("输入有误,");
flag=true;
}
}
return -1;
}
}
public class MagicSquare {
//written by oneym
//2014-2-25
* @param args
*/public static void main(String[] args) {
// TODO Auto-generated method stub
//幻和值
int n = input();
int sum = (n*n+1)*n/2;
int[][] a;
a=makeMS(n);
check(a, sum);
print(a);
}
static boolean rowSum(int[][] a,int sum0){
//各行的和等于幻和返回 true
System.out.print("行检查中");
int[] r = new int[a.length-2];
for(int i=1;i<a.length-1;i++){
int sum=0;
for(int j=1;j<a[i].length-1;j++){
sum += a[i][j];
}
r[i-1]=sum;
}
for(int i=0;i<r.length;i++){
if(sum0 == r[i]){
System.out.print(".");
}else{
System.out.println("第"+i+"行="+r[i]+",应为:"+sum0);
return false;
}
}
System.out.println();
return true;
}
static boolean columnSum(int[][] a,int sum0){
//各列的和等于幻和返回 true
System.out.print("列检查中");
int[] c = new int[a.length];
for(int i=1;i<a.length-1;i++){
int sum=0;
for(int j=1;j<a[i].length-1;j++){
sum += a[j][i];
}
c[i] =sum;
}
for(int i=1;i<c.length-1;i++){
if(sum0 == c[i]){
System.out.print(".");
}else{
System.out.println("第"+i+"列="+c[i]+",应为:"+sum0);
return false;
}
}
System.out.println();
return true;
}
static boolean diagonalSum(int[][] a,int sum0){
//对角线的和等于幻和返回 true
System.out.print("对角线检查中");
int[] d = new int[2];
int sum1=0;
int sum2=0;
for(int i=0;i<a.length;i++){
for(int j=0;j<a[i].length;j++){
if(i==j){
sum1 += a[i][j];
sum2 += a[a.length-1-i][j];
}
}
}
d[0] = sum1;
d[1] = sum2;
if( sum0==d[0] && sum0==d[1]){
System.out.println("..");
return true;
}else{
System.out.println("对角线有错,不是完美幻方!");
return false;
}
}
static boolean exist(int a){
if(0 != a)
return false;
return true;
}
/**
*
* @param n0 n0阶幻方维度,n0为奇数
* @return a 幻方
*/
static int[][] makeMS(int n0){
int n=n0;
//产生扩大的二维数组,多一圈零
int[][] a = new int[n+2][n+2];
//将数字1放在第一行中间列
int i=1;
int j=(n+2)/2;
a[1][j]=1;
//按规律填入2:n*n的自然数
for(int k=2;k<=n*n;k++){
//坐标移向右上角
i--;
j++;
//保存移动前的坐标
int posi=i+1;
int posj=j-1;
//横坐标移到第1行之前,需转到最后一行
if( i < 1 )
i=a.length-2;
//纵坐标移到最后一行之后,需转到第1行
if( j > a.length-2)
j=1;
//a[i][j]上未插入数字
if( exist(a[i][j]) ){
a[i][j]=k;
}else{
i=posi+1;
j=posj;
a[i][j]=k;
}
}
return a;
}
/**
*
* @param a 幻方
*/
static void print(int[][] a){
for(int i=1;i<a.length-1;i++){
for(int j=1;j<a[i].length-1;j++){
System.out.print(a[i][j]+"\t");
}
System.out.println();
}
}
/**
*
* @param a 幻方
* @param sum0 幻和
*/
static void check(int[][] a,int sum0){
if( rowSum(a,sum0) ){
System.out.println("行检查完毕!");
}
if( columnSum(a,sum0) ){
System.out.println("列检查完毕!");
}
if( diagonalSum(a,sum0) ){
System.out.println("对角线检查完毕!");
}
}
/**
* @return n 输入的奇数
*/
static int input(){
boolean flag=true;
while(flag){
System.out.println("请输入一个奇数:");
Scanner reader=new Scanner(System.in);
int n=reader.nextInt();
if( 1==(n%2)){
flag=false;
return n;
}else{
System.out.print("输入有误,");
flag=true;
}
}
return -1;
}
}