import java.util.Scanner;
//九宫格,二十五宫格,甚至八十一宫格,只要是
//奇数的平方宫格者能做到横格相加,竖格相加,斜格相加得数相同。
//而偶数的宫格只有十六宫格有些规律。 这里不做解释
//下面是三宫格、五宫格、七宫格、九宫格图.
//三宫格(和15)
//8 1 6
//3 5 7
//4 9 2
//五宫格(和65)
//17 24 1 8 15
//23 5 7 14 16
//4 6 13 20 22
//10 12 19 21 3
//11 18 25 2 9
//七宫格(和175)
//30 39 48 1 10 19 28
//38 47 7 9 18 27 29
//46 6 8 17 26 35 37
//5 14 16 25 34 36 45
//13 15 24 33 42 44 4
//21 23 32 41 43 3 12
//22 31 40 49 2 11 20
//九宫格(和369)
//47 58 69 80 1 12 23 34 45
//57 68 79 9 11 22 33 44 46
//67 78 8 10 21 32 43 54 56
//77 7 18 20 31 42 53 55 66
//6 17 19 30 41 52 63 65 76
//16 27 29 40 51 62 64 75 5
//26 28 39 50 61 72 74 4 15
//36 38 49 60 71 73 3 14 25
//37 48 59 70 81 2 13 24 35
//经验规则:从 1开始按顺序逐个填写;1放在第一行的中间位置;下一个数往右上角45度处填写;
//如果单边越界则按头尾相接地填;如果有填写冲突,则填到刚才位置的底下一格;
//如果有两边越界,则填到刚才位置的底下一格。
//九宫格的 1至少还可以填在另外的三个位置,只是接下来的填写顺序需要相应改变;
//再根据九宫格的对称性,至少可以有8种不同的填写方式
public class SudokuGame {
public static void main(String[] args) {
System.out.println(“请输入九宫格的行列规模(只能是正奇数的)”);
Scanner nScanner = new Scanner(System.in); //输入一个n
int n = nScanner.nextInt(); //定义n为九宫格的行列数
System.out.println(“n=” + n);
if(n>0&&n%2==1){
int[][] sudokuGame = new int[n][n]; //定义保存九宫格的数组
int row = 0; //行,初始位置
int col = n / 2; //列,初始位置,因为列由0开始,故n/2是中间位置
System.out.println(“九宫格为:”);
for (int i = 1; i <= n * n; i++) {
sudokuGame[row][col] = i;
row–;
col++;
if (row < 0 && col >=n) {
row+= 2;
col–; //行列都越界,则行在原基础上加1,列不变
// (col>=n!!一开始忘记写=结果出现以下提示,数组越界
// Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 3
// at SudokuGame.main(SudokuGame.java:57)
}
else if (row < 0) {
row = n - 1; //行越界,则行变为最后一行,列加1
}
else if (col >= n) {
col = 0; //列越界,则列变为第一列,列加1
}
else if (sudokuGame[row][col] != 0) {
row+=2;
col–;
}
}
// 打印出结果
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(sudokuGame[i][j] + “\t”);
}
System.out.println();
}
}
else{
System.out.println(“输入错误,请重新输入n”);}
}
}