package com.thealgorithms.maths;
import java.util.Scanner;
/*A magic square of order n is an arrangement of distinct n^2 integers,in a square, such that the n
numbers in all rows, all columns, and both diagonals sum to the same constant. A magic square
contains the integers from 1 to n^2.*/
public final class MagicSquare {
private MagicSquare() {
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Input a number: ");
int num = sc.nextInt();
if ((num % 2 == 0) || (num <= 0)) {
System.out.print("Input number must be odd and >0");
System.exit(0);
}
int[][] magicSquare = new int[num][num];
int rowNum = num / 2;
int colNum = num - 1;
magicSquare[rowNum][colNum] = 1;
for (int i = 2; i <= num * num; i++) {
if (magicSquare[(rowNum - 1 + num) % num][(colNum + 1) % num] == 0) {
rowNum = (rowNum - 1 + num) % num;
colNum = (colNum + 1) % num;
} else {
colNum = (colNum - 1 + num) % num;
}
magicSquare[rowNum][colNum] = i;
}
// print the square
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
if (magicSquare[i][j] < 10) {
System.out.print(" ");
}
if (magicSquare[i][j] < 100) {
System.out.print(" ");
}
System.out.print(magicSquare[i][j] + " ");
}
System.out.println();
}
sc.close();
}
}
魔方阵被定义为一个包含多个不同整数的正方形,这些整数的排列方式使得每一行、每一列和主对角线上的数字之和都相同,通常也包括一些或所有其他对角线。
n
阶的魔方阵是指在一个正方形中排列n²
个数字(通常是唯一的整数)的一种方式。所有行、列和对角线上的 n
个数字加起来都等于同一个常数。一个魔方阵包含从 1 到 n²
的整数。每一行、每一列和对角线上的固定和被称为魔数或魔和。它用字母 M 表示。一个典型魔方阵的魔数完全取决于 n
的值。因此,魔和的值使用以下公式计算
M = n(n² + 1)/2
这是魔方阵公式,用于制作不同阶数的魔方阵。如果我们从每个数字中减去 (n²
+ 1),我们会得到另一个魔方阵,这被称为互补魔方阵。包含从 1 开始的连续数字的正方形通常被称为正常魔方阵。
如上所述,魔方阵和的公式为 n(n² + 1)/2。
对于一个 3 阶魔方阵,我们需要将 n = 3 代入公式,以确定魔和,这样我们就可以轻松地构建 3×3 的魔方阵。
当 n = 3
时,和 = 3(3*3 + 1)/2 = 3(9 + 1)/2 = (3 × 10)/2 = 15
现在,我们需要将数字放在相应的位置上,以便每行、每列和对角线上的数字之和都等于 15。
设 x
为魔方阵的阶数。
在这种情况下,x = 3
。
考虑另一个数字 y
,使得 x
和 y
的乘积等于魔和,即 15。
所以,y = 5 {xy = (3)(5) = 15}
y 的值应该始终位于正方形的中心,而 x 应该位于它的左侧单元格。
x 上方的单元格被视为 y – 1,如下所示
让我们制作上面正方形的互补魔方阵。
(n² + 1) = 32 + 1 = 9 + 1 = 10
现在,从 (n² + 1) 中减去每个数字,即从 10 中减去。
第一行数字
第二行数字
第三行数字