实现功能首先可以观察数字排列规律。
1 2 3 4 5 6 7 8 9,数字以5为中心,首尾相加相等,故在九宫格中排列时只需将首尾数字依次对应排列,且将5放于中间格,观察九宫格。
斜看情况下,数字排列按照顺序排列即可,在示例图中,下一位数字(n+1)的 行 是上一位数字(n)的(行 - 1),列 是 (列 + 1)。 遇到 行列 超出数组范围,按照不同情况进行处理,处理过程参考下文代码中的注释。
import java.util.Scanner;
public class SumNine {
public static void main(String[] args){
int n ;
boolean mark = true;
Scanner sc = new Scanner(System.in);
System.out.println("请输入N,N为奇数");
n = sc.nextInt();
while (mark){
if (n % 2 == 0 || n < 0){
System.out.println("输入的数字小于0或不为奇数,请重新输入");
n = sc.nextInt();
}
else{
mark = false;
}
}
int[][] arr = new int[n][n];
// 完成建立N*N的数组,开始填数。1、行超限;2、列超限;3、行列超限;4、下一空缺有数
// 进行判断需要有先后,只有 行列均不超限 的情况下才能判断数组某个位置是否为空值。 行列均超限时,会同时满足超限的单一条件,故必须放在第一个判断。
// 否则将无法触发判断条件。
int a = 0, b = n / 2;
for (int i = 1; i <= n*n; i++){
arr[a][b] = i;
// System.out.println("i 的值为:"+i);
// System.out.println("ab 的值为:"+ a + "--" + b);
a--;
b++;
//若行列均超限,则列保持上一个数不变,行加一。
if (a < 0 && b >= n){
a += 2;
b--;
}
// 若行超限,则移动至最后一行
else if (a < 0){
a = n - 1;
}
// 若列超限,则移动至第一列
else if (b >= n){
b = 0;
}
// 或下一目标位置不为空(数组未定义值时,默认为0)
else if (arr[a][b] != 0){
a += 2;
b--;
}
}
// 遍历数组,并输出
for (int[] c : arr){
for (int d : c){
System.out.print(d + "\t");
}
System.out.println();
}
sc.close();
}
}
本人JAVA自学新手,本文目的在于加强自我学习,文中有不对之处,请多多指教。
排列方法不限此种,图文仅给出了其中一种解题思路。
代码参考了其他题主,非原创,侵删。