java构建n阶魔方方阵

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;
    }
}

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunny_daily

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值