(1)幻方概念:
n阶幻方是指自然数1---n的平方排列成n*n阶方阵,其各行各列及对角线上的数字之和相等,和数S=n(n的平方+1)/2。
(2)连续摆数法概念:
(3)代码实现
import java.util.Scanner;
/**
* @date 2017-5-31
* @author liuffei
* @description 求解n阶幻方
*/
public class MagicSquare {
/**
* 连续摆数法:适用于构造奇数阶幻方
* @return
*/
public static int[][] continuousPendulumMethod(int n){
//创建一个空的二维矩阵
int[][] matrix = new int[n][n];
int end = n*n;//最后一个数
int begin = n/2 ;//开始的位置
int count = 1;
matrix[0][begin] = count;
int i = 0,j = begin;//循环开始
while(count < end){
if(i == 0){
i = n - 1;
j = j + 1;
matrix[i][j] = ++count;
}
//沿斜线上递增
while(j < n - 1 && count < end && i > 0){
i--;
j++;
if(0 != matrix[i][j]){
//如果已经存在数字,就退到前一个数的下一行上
i = i + 2;
j = j - 1;
matrix[i][j] = ++count;
}else{
matrix[i][j] = ++count;
}
}
//当递增到右边时,折返到左边,此时i已经加1,j置为0
while(j == n -1 && count < end){
if(i == 0){
i = 1;
}else{
j = 0;
i = i - 1;
}
matrix[i][j] = ++count;
}
}
return matrix;
}
/**
* 打印矩阵
* @param matrix 矩阵
*/
public static void printMatrix(int[][] matrix){
int row = matrix.length;
for(int i = 0;i < row;i++){
for(int j = 0;j < matrix[i].length;j++){
System.out.print(matrix[i][j] + " ");
}
System.out.println("");
}
}
public static void main(String[] args) {
System.out.println("请输入奇数方阵的阶数:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] matrix = continuousPendulumMethod(n);
printMatrix(matrix);
}
}
(4)实现效果