(java)输出“魔方阵”。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。

用java编写,求思路和程序,详解,思路希望可以写出,谢谢了

package com.csdn;

import java.util.Scanner;

//所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。
public class MoFang {
	// 奇数幻方的实现:
	// 卢培步法求奇数阶幻方的函数,参数依次是储存幻方的数组的名称、幻方的阶数,
	// 标志位flag(为1表示主函数直接调用求奇数阶幻方,为0表示SingleEven_Magic函数进行的调用)
	public static void Odd_Magic(int array[][], int k, int flag) {
		int i = k, j = (k + 1) / 2, c = 1;
		while (c <= k * k) {
			array[i][j] = c;
			if (c % k == 0) {// 若c是k的倍数,向上走
				i -= 1;
			} else {// 若c不是k的倍数,向右下走
				i += 1;
				j += 1;
				if (i > k) {
					i = 1;
				}
				if (j > k) {
					j = 1;
				}
			}
			c++;
		}
		if (flag == 1) {
			outputArray(array);
		}
	}

	// 双偶数幻方:
	// 即:阶数能够被4整除的幻方构造函数,参数依次是储存幻方的数组的名称、幻方的阶数
	public static void DoubleEven_Magic(int array[][], int k) {
		int i = 1, j, c1 = 1, c2 = k * k;
		while (i < k) { // 把4k阶看作k*k 个4*4 的方块,将主对角线和反对角线上的元素标记为 -1
			j = 1;
			while (j < k) {
				array[i][j] = array[i + 1][j + 1] = array[i + 2][j + 2] = array[i + 3][j
						+ 3] = array[i][j + 3] = array[i + 1][j + 2] = array[i + 2][j + 1] = array[i + 3][j] = -1;
				j += 4;
			}
			i += 4;
		}

		for (i = 1; i <= k; i++)
			for (j = 1; j <= k; j++) {

				// 标记为0的进行正向依次赋值(java 在整型数组实例化时将所有元素初始化赋值为0)
				if (array[i][j] == 0) {
					array[i][j] = c1;
				}
				// 否则,标记为-1 的进行反向依次赋值。
				else {
					array[i][j] = c2;
				}
				c1++;
				c2--;
			}
		outputArray(array);// 输出幻方

	}

	// 单偶数幻方:
	// 即:阶数被4除余2的幻方构造函数,参数依次是储存幻方的数组的名称、幻方的阶数
	public static void SingleEven_Magic(int array[][], int k) {
		int a[][] = new int[k + 1][k + 1];
		int b[][] = new int[k + 1][k + 1];
		int m[][] = new int[k / 2 + 1][k / 2 + 1];
		int i, j;

		Odd_Magic(m, k / 2, 0);

		// 由k/2奇数阶幻方衍生出1比4的k阶方阵M
		for (i = 1; i <= k / 2; i++)
			for (j = 1; j <= k / 2; j++) {
				a[2 * i - 1][2 * j - 1] = a[2 * i - 1][2 * j] = a[2 * i][2 * j - 1] = a[2 * i][2 * j] = m[i][j];
			}

		// 构造方阵N
		i = 1;
		j = 1;
		while (i < k) {
			j = 1;
			while (j < k) {
				// 上半部分A型 1230
				if (i < k / 2 || i == k / 2 && (j == k / 2 + 2 || j == k / 2 - 2) || i == k / 2 + 2 && j == k / 2) {
					b[i][j] = 1;
					b[i][j + 1] = 2;
					b[i + 1][j] = 3;
					b[i + 1][j + 1] = 0;
				}
				// 左半部分C型 3102
				else if (i == k / 2 && j < k / 2 - 2) {
					b[i][j] = 3;
					b[i][j + 1] = 1;
					b[i + 1][j] = 0;
					b[i + 1][j + 1] = 2;
				}
				// 右半部分D型 2013
				else if (i == k / 2 && j > k / 2 + 2) {
					b[i][j] = 2;
					b[i][j + 1] = 0;
					b[i + 1][j] = 1;
					b[i + 1][j + 1] = 3;
				}
				// 6*6 核心中央和两足 1203
				else if (i == k / 2 && j == k / 2 || i == k / 2 + 2 && (j == k / 2 + 2 || j == k / 2 - 2)) {
					b[i][j] = 1;
					b[i][j + 1] = 2;
					b[i + 1][j] = 0;
					b[i + 1][j + 1] = 3;
				}
				// 下半部分B型 2103
				else {
					b[i][j] = 2;
					b[i][j + 1] = 1;
					b[i + 1][j] = 0;
					b[i + 1][j + 1] = 3;
				}
				j += 2;
			}
			i += 2;
		}

		for (i = 1; j <= k; i++)
			for (j = 1; j <= k; j++) {
				array[i][j] = 4 * a[i][j] - b[i][j]; // 4*M-N 幻方形式
			}
		// outputArray(array);
		System.out.println();
		// 两种幻方输出时中间间隔一行;
		for (i = 1; i <= k; i++)
			for (j = 1; j <= k; j++) {
				array[i][j] = a[i][j] + (k / 2) * (k / 2) * b[i][j]; // M+(k/2)*(k/2)*N 幻方形式

			}
		outputArray(array);
	}

	// 输出幻方的函数,参数是储存幻方的数组的名称
	public static void outputArray(int array[][]) {
		for (int row = 1; row < array.length; row++) {
			for (int column = 1; column < array[row].length; column++) {
				System.out.printf("%5d", array[row][column]);
			}
			System.out.println();
		}
	}

	// 测试函数
	public static void main(String args[]) {
		int a[][];
		System.out.println("请输入幻方阶数:");
		Scanner input = new Scanner(System.in);
		int k = input.nextInt();
		a = new int[k + 1][k + 1];
		// 阶数为2的幻方不存在
		if (k == 2) {
			System.out.println("不存在阶数为2的幻方,请重新输入!");
		}
		// 奇数阶幻方
		else if (k % 2 != 0) {
			Odd_Magic(a, k, 1);
		}
		// 4k型幻方(双偶数幻方)
		else if (k % 4 == 0) {
			DoubleEven_Magic(a, k);
		}
		// 4k+2型幻方(单偶数幻方)
		else {
			SingleEven_Magic(a, k);
		}
	}

}

如有帮助,望采纳。点击我回答右上角【采纳】按钮。