将1--n^2的自然数摆成n行n列的方阵,要求每一行、每一列、二条对角线上的数加起来都相等,这样的方阵称为n阶魔方阵.例如:3阶魔方阵如下:
4 3 8
9 5 1
2 7 6
将1--n^2依次摆放成魔方阵的规律如下:
1.将1放在中间行,最右边列;
2.下一个数放在上一个数的右下角,如右下角已经放有数则放在上一个数的左边.
编程输出任意n阶魔方阵.
参考:
import java.util.Scanner;
public class n阶魔方阵 {
private static void Magic(int n) {
int mat[][] = new int[n][n];
int i = 0, j = n / 2; //将1放在第一行中间列
for (int k = 1; k <= n * n; k++) { //对n*n个空位置的魔方填入数据
mat[i][j] = k;
if (k % n == 0) { //下一位有数字,每三次产生一次下一位有数字
i = (i + 1) % n; //下一位在下一行
} else {
i = (i - 1 + n) % n; //在没到边界时,每次i减一,+n为了防止出现负数
j = (j + 1) % n; //每n个数换一列
}
}
for (i = 0; i < mat.length; i++) { //输出魔方阵
for (j = 0; j < mat[i].length; j++) {
System.out.print(mat[i][j] + "\t");
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Magic(n);
}
}
//运用Java二维数组打印“魔方阵”。
//所谓魔方阵是指这样的矩阵,
//它的每一行、每一列和对角线之和均相等.
//要求打印1~25之间由自然数构成的魔方阵。
public class Csj03 {
public static void main(String[] args) {
//定义
int i, j, k;
int[][] arr =new int[5][5];
//对数组赋初值
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
arr[i][j] = 0; /* 先令所有元素都为0 */
}
} /*
* 一般数值型变量为0; 字符(串)为空或space。
//对1先处理 * 良好的编程习惯是自己对数组置初值,不要用默认的方法,这样可以提高程序在不同开发系统中得兼容性。*/
j = 2;
arr[0][j] = 1; /* 将1放在第一行中间一列 */
//对剩下的数处理
for (k = 2; k <= 25; k++) { /* 再从2开始处理 */
i = i - 1; //总体规律/* 存放的行比前一个数的行数减1 */
j = j + 1; /* 存放的列比前一个数的列数加1 */
if ((i < 0) && (j == 5)) { // 特殊情况 /* 前一个数是第一行第N列时,把下一个数放在上一个数的下面 */
i = i + 2;
j = j - 1;
} else {
if (i < 0) //处理方法: /* 当行数减到第一行,返回到最后一行 */
i = 4;
if (j > 4 ) /* 当列数加到最后一行,返回到第一行 */
j = 0;
}
if (arr[i][j] == 0) { /* 如果该元素为0,继续执行程序 */
arr[i][j] = k;
}else { /* 如果该元素不为0,就说明要填的数的位置已经被占,则该数放在上一个数的下面 */
i = i + 2;
j = j - 1;
arr[i][j] = k;
}
}
//打印数组
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
System.out.printf("%3d", arr[i][j]); // C语言中%3d 表示以3位的固定宽度输出整型数。 //注意:不足3位,在前面补空格; 超过3位,按实际位数输出(但是要在其范围内-32768 ~ 32767)。
}System.out.println();
}
}
}