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;
}
}
java构建n阶魔方方阵
于 2022-11-01 17:05:35 首次发布