魔方阵的三种情况实现
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();
}
}
}