问题:奇数阶二维数组存入自然数并使得行,列和对角线元素相加之和相等?

解题思路:本程序的奇数阶为n*n,n = 3,数组名为int [][]oddArr = new int[n][n];

    解决方式1:按照数字键盘的排列方式排列   

7 8 9
4 5 6
1 2 3

 解决方式2:y:行下标,x:列下标

  1.  将1放入y = 0,x  = n/2的位置中,即a[0][n/2] = 1;

  2.  从2到n*n(3*3)的各个数字以45°向右上方依次放入值,其中行数减'1'列数加'1'(x+1,y-1);

  3.  如果行或列超出矩阵范围,则循环绕回,例如1在第一行时,根据规则2就应在最下一行,与此同时列数在1所在的列数基础上加1;

  4. 如果按照以上规则确定的位置已经存在数值,或者行和列都超出矩阵范围,那么下一个数就应放在上一个数的下方。

  5. 如图1.1所示

    奇数阶二维数组存入自然数并使得行,列和对角线元素相加之和相等_第1张图片


代码实现:

public class FactorialMatrix {

	private static Scanner scanner;

	public static void main(String[] args) {

		scanner = new Scanner(System.in);

		System.out.println("输入奇数:");
		int oddNum = scanner.nextInt();
		int[][] oddArr = new int[oddNum][oddNum];
		for (int x = 0; x < oddNum; x++) {
			for (int y = 0; y < oddNum; y++) {
				oddArr[y][x] = 0;
			}
		}
		int y = 0;
		int x = oddNum / 2;
		int yNext, xNext;
		oddArr[y][x] = 1;
		for (int num = 2; num <= oddNum * oddNum; num++) {
			yNext = y;
			xNext = x;
			y--;
			x++;
			if (y < 0) {
				y = oddNum - 1;
			}
			if (x >= oddNum) {
				x = 0;
			}
			if (oddArr[y][x] != 0) {
				y = yNext + 1;
				x = xNext;
			}
			oddArr[y][x] = num;
		}
		for (int i = 0; i < oddNum; i++) {
			for (int j = 0; j < oddNum; j++) {
				System.out.print("\t" + oddArr[i][j]);
			}
			System.out.println();
		}
	}

}