- package dataStructure;
- import java.util.Arrays;
- import java.util.Scanner;
-
- /*
- * 构造魔方方阵
- */
- public class Magic_Matrix {
- public static void main(String args[]) {
- Scanner input = new Scanner(System.in);
- System.out.print("请输入方阵阶数:");
- int n = input.nextInt();
- Magic_Matrix matrix = new Magic_Matrix();
- int[][] magic_marix = null;
- if(n % 2 == 1) {
- magic_marix = matrix.build_Matrix_method1(n);
- }else if(n % 4 == 0) {
- magic_marix = matrix.build_Matrix_method2(n);
- }else {
- magic_marix = matrix.build_Matrix_method3(n);
- }
- for(int[] temp:magic_marix) {
- System.out.println(Arrays.toString(temp));
- }
- }
- /*
- * n为被4整除的偶数
- */
- public int[][] build_Matrix_method2(int n){
- int[][] magic_matrix = new int[n][n];
- for(int indexI =0, indexJ =0,i = 1;i<=n*n;i++) {
- magic_matrix[indexI][indexJ] = i;
- indexJ = indexJ+1;
- if(indexJ == n) {
- indexI = indexI+1;
- indexJ = 0;
- }
- }
- int temp = n/4;
- for(int indexI = 0;indexI < n;indexI++) {
- if(indexI % 4 == 0 || indexI % 4 == 3) {
- for(int indexJ = 0;indexJ < temp ;indexJ++) {
- magic_matrix[indexI][4*indexJ] = n*n+1 - magic_matrix[indexI][4*indexJ];
- magic_matrix[indexI][4*indexJ+3] = n*n+1 - magic_matrix[indexI][4*indexJ+3];
- }
- }else {
- for(int indexJ = 0; indexJ < temp; indexJ++){
- magic_matrix[indexI][4*indexJ + 1] = n*n+1 - magic_matrix[indexI][4*indexJ + 1];
- magic_matrix[indexI][4*indexJ + 2] = n*n+1 - magic_matrix[indexI][4*indexJ + 2];
- }
- }
- }
-
- return magic_matrix;
- }
-
- /*
- * n为不能被4整除的偶数
- */
- public int[][] build_Matrix_method3(int n){
- int[][] magic_matrix = new int[n][n];
- int indexI = 0,indexJ = n/4,temp = (n-2)/4;
- magic_matrix[indexI][indexJ] = 1;
- for(int i =2;i<=n*n/4;i++) {
- int indexI_last = indexI;
- int indexJ_last = indexJ;
- indexI = indexI-1;
- indexJ = indexJ +1;
- if(indexI < 0) {
- indexI = n/2-1;
- }
- if(indexJ == n/2) {
- indexJ = 0;
- }
- if(magic_matrix[indexI][indexJ] != 0) {
- indexI = indexI_last +1;
- indexJ = indexJ_last;
- if(indexI == n/2) {
- indexI = 0;
- }
- }
- magic_matrix[indexI][indexJ] = i;
- }
-
- for(indexI = 0; indexI< n/2; indexI++){
- for(indexJ = 0; indexJ < n/2; indexJ++){
- magic_matrix[indexI + n/2][indexJ] = magic_matrix[indexI][indexJ] + 3*n*n/4;
- magic_matrix[indexI][indexJ + n/2] = magic_matrix[indexI][indexJ] + n*n/2;
- magic_matrix[indexI + n/2][indexJ + n/2] = magic_matrix[indexI][indexJ] + n*n/4;
- }
- }
- int tempValue = 0;
- for(indexI = 0; indexI< n/2; indexI++){
- for(indexJ = 0; indexJ < temp; indexJ++){
- if(indexI == n/4){
- tempValue = magic_matrix[n/4][n/4 + indexJ];
- magic_matrix[n/4][n/4 + indexJ] = magic_matrix[3*n/4][n/4 + indexJ];
- magic_matrix[3*n/4][n/4 + indexJ] = tempValue;
- }else{
- tempValue = magic_matrix[indexI][indexJ];
- magic_matrix[indexI][indexJ] = magic_matrix[indexI + n/2][indexJ];
- magic_matrix[indexI + n/2][indexJ] = tempValue;
- }
- }
- }
-
- if(temp > 1){
- for(indexI = 0; indexI< n/2; indexI++){
- for(indexJ = 0; indexJ < temp-1; indexJ++){
- tempValue = magic_matrix[indexI][3*n/4 - indexJ];
- magic_matrix[indexI][3*n/4 - indexJ] = magic_matrix[indexI + n/2][3*n/4 - indexJ];
- magic_matrix[indexI + n/2][3*n/4 - indexJ] = tempValue;
- }
- }
- }
- return magic_matrix;
- }
-
- /*
- * n为奇数
- * ,当n为奇数时,逻辑最简单
- * 1.将1放到第一行中间以列
- * 2.从2开始知道n*n,各数依靠如下规则放置
- * 每一个数字存放的行比上一个数字的行减1,列加1
- * 例如当n=3时,1放在第一行的第二列,则2放在最后一行的第3列
- */
- public int[][] build_Matrix_method1(int n){
- int[][] magic_matrix = new int[n][n];
- int indexI = 0;
- int indexJ = n/2;
- int value = 1;
- while(value <= n*n) {
- magic_matrix[indexI][indexJ] = value;
- value++;
- if(value % n == 1) {
- indexI++;
- }else {
- indexI--;
- indexJ++;
- if(indexI < 0) {
- indexI = n-1;
- }
- if(indexJ > n-1) {
- indexJ = 0;
- }
- }
- }
- return magic_matrix;
- }
- }