魔方阵

魔方阵的三种情况实现

import java.util.Scanner;

import javax.management.relation.Role;

public class AAA {
	/*奇数魔方阶
	 * 从1开始 1从第一行的正中间开始,自右上移动,超出范围的行或列则跳到相反对应的行与列,当右上有重复时,
	 * 如果该数能整除n,则向下填充。
	*/
    public static void OddNumber(int[][] array, int n) {
		int row = 0, col = n/2;//记录行,列
		array[row][col] = 1;
		//模拟
		for(int i = 2; i <= n*n; i++)
		{
			//判断下一行能否填放
			if(array[(row+n-1)%n][(col+1)%n] != 0)
			{
				row = (row+1)%n;
			}
			else 
			{
				row = (row+n-1)%n;
				col = (col+1)%n;
			}
			array[row][col] = i;
		}
	}
    
    
    /*被4整除魔方阶
    1:把魔方阵分为上下左右4个n/2*n/2的小的方阵,左上角和右下角的n/2*n/2的小矩阵
    2:偶行偶列,奇行奇列赋值为0,其余赋值为1;右上角和左上角的n/2*n/2的小矩阵,偶行奇列,奇行偶列赋值为0,其余赋值为1。
    3:从魔方阵由左到右,由上到下开始赋值,赋值为从n*n到1,若遇到原来填入方阵中的0,则跳过此格;
    4:从魔方阵由左到右,由上到下开始赋值,赋值为从1到n*n,若遇到原来填入方阵中的1,则跳过此格;
    */
    public static void EvenNumber1(int[][] array, int n) {
    	//执行第二步
		for(int i = 0; i < n; i++)
		{
			for(int j = 0; j < n; j++)
			{
				if((i%2 == 0 && j%2 == 0)||(j%2 != 0 && i%2 != 0))
				{
					array[i][j] = 0;
				}
				else
				{
					array[i][j] = 1;
				}
			}
		}
		//左上角
		for(int i = 0; i < n/2; i++)
		{
			for(int j = 0; j < n/2; j++)
			{
				if((i%2 == 0 && j%2 != 0)||(j%2 == 0 && i%2 != 0))
				{
					array[i][j] = 0;
				}
				else
				{
					array[i][j] = 1;
				}
			}
		}
		//右上角
		for(int i = n-1; i >= n/2; i--)
		{
			for(int j = n-1; j >= n/2; j--)
			{
				if((i%2 == 0 && j%2 != 0)||(j%2 == 0 && i%2 != 0))
				{
					array[i][j] = 0;
				}
				else
				{
					array[i][j] = 1;
				}
			}
		}
		//执行3,4步
		int temp = n*n;
		for(int i = 0; i < n; i++)
		{
			for(int j = 0; j < n; j++)
			{
				if(array[i][j] == 1)
				{
					array[i][j] = temp;
				}
				temp--;
			}
		}
		temp = 1;
		for(int i = 0; i < n; i++)
		{
			for(int j = 0; j < n; j++)
			{
				if(array[i][j] == 0)
				{
					array[i][j] = temp;
				}
				temp++;
			}
		}
	}

    
    /*不被4整除偶数魔方阶
    1.将魔方分成A、B、C、D四个k阶方阵,这四个方阵都为奇方阵,利用上面讲到的方法依次将A、D、B、C填充为奇魔方。
    2.交换A、C魔方元素,对魔方的中间行,交换从中间列向右的m列各对应元素;对其他行,交换从左向右m列各对应元素。
    3.交换B、D魔方元素,交换从中间列向左m – 1列各对应元素。
    */
    public static void EvenNumber2(int[][] array, int n) {
		int k = n/2;
		int col = (k-1)/2, row = 0;
		array[row][col] = 1;
		//生成方阵A
		for(int i = 2; i < k*k; i++)
		{
			if((i-1)%k == 0)
			{
				row++;
			}
			else 
			{
				row = (row-1+k)%k;
				col = (col+1)%k;	
			}
			array[row][col] = i;
		}
		//根据A生成BCD方阵
		for(row = 0; row < k; row++)
		{
			for(col = 0; col < k; col++)
			{
				array[row+k][col+k] = array[row][col] + k*k;
				array[row][col+k] = array[row][col] + 2*k*k;
				array[row+k][col] = array[row][col] + 3*k*k;
			}
		}
		for(row = 0; row < k; row++)
		{
			int temp;
			if(row == k/2)
			{
				for(col = k/2; col < k-1; col++)
				{
					temp = array[row][col];
					array[row][col] = array[row+k][col];
					array[row+k][col] = temp;
				}
			}
			else 
			{
				for(col = 0; col < k/2; col++)
				{
					temp = array[row][col];
					array[row][col] = array[row+k][col];
					array[row+k][col] = temp;
				}
			}
		}
		for(row = 0; row < k;row++)
	    {
			int temp;
	        for(int i = 0;i < (k-1)/2 - 1; i++)
	        {
	            temp = array[row][k+k/2 - i];
	            array[row][k+k/2 - i] = array[row + k][k+k/2 - i];
	            array[row + k][k+k/2 - i] = temp;
	        }
	    }
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个正整数");
        int num = scanner.nextInt();
        int[][] array = new int[num][num];
        if(num%2 != 0)
        {
        	OddNumber(array, num);
        }
        else 
        {
        		if(num%4 == 0)
        		{
        			EvenNumber1(array, num);
        		}
        		else 
        		{
        			EvenNumber2(array, num);
				}
		}
        //打印
        for(int i = 0; i < num; i++)
        {
        	for(int j = 0; j < num; j++)
        	{
        		System.out.print(array[i][j]);
        		System.out.print(" ");
        	}
        	System.out.println();
        }
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值