场景:九宫格的同一行,同一列,同对角线上的数字加起来相等

实现九宫格可使用以下策略:
1、最小值永远在最上行的中间格,最大值永远在最下行的中间格。
2、最上行碰壁,下一个数填入右列最下格。
3、最右列碰壁,下一个数填入上一行最左格。
4、右上格有空就一直填下一个数;右上格有数,就将下一个数字填入上一个数的下一格。
5、右上角的下一个数,必定在其下一格;左下角的上一个数,必定在其上一格。
具体代码实现思路:
1.先定义一个一个int型的二维数组arr,并定义及初始化变量,行row=0,列col=n/2(n为二维数组的列);
定义变量x=1用于后续遍历。
2.设置九宫格第一行中间一个格子的值为1;
3.使用while循环,当x<=n*n时,进入循环并作以下判断
1)从当前数字的右上角开始填下一个数字,如果下个数字超出当前行,row=当前数组长度-1,继续向右上角填数字
2)同时列右移加1,如果列超出边界,就将其设置为0
3)判断当前格子中是否有数字,如果值为0,代表没有填过数字,此时,设置当前格子的值为目前循环的数字。
4)如果当前格子中有数字,这里就要用到回溯法,在循环的最开始记录当前的行,列。然后设置行加1,向下移动。再设置当前的格子值为循环的数字。
代码实现:
import java.util.Scanner;
public class NineGrid {
public static void main(String[] args) {
System.out.print("请输入一个奇数:");
Scanner sc = new Scanner(System.in);
int n;
while (true){
n = sc.nextInt();
if(n%2==0){
System.out.println("输入有误,请输入一个奇数!");
}else {
break;
}
}
int[][] arr = new int[n][n];
int row = 0,col = n/2;
int x=1;
arr[row][col] = 1;
while(x<n*n){
int tempRow = row;
int tempCol = col;
row--;
if(row<0){
row = n-1;
}
col++;
if(col==n){
col = 0;
}
x++;
if(arr[row][col]==0){
arr[row][col] = x;
}else{
row = tempRow;
col = tempCol;
row++;
arr[row][col] = x;
}
}
for(int i=0;i<n ;i++){
for(int j=0;j<n;j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}
输出结果:
请输入一个奇数:3
8 1 6
3 5 7
4 9 2
请输入一个奇数:5
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
这篇博客介绍了如何使用Java实现九宫格填数,遵循特定策略:最小值在最上行中间,最大值在最下行中间。通过判断行、列的位置变化,结合回溯法填充数字,确保每一行、每一列、对角线上的数字和相等。提供了具体代码实现,并展示了3x3和5x5的示例输出。

1586

被折叠的 条评论
为什么被折叠?



