import java.util.Scanner;
public class 魔方阵 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner sc = new Scanner(System.in);
int N=sc.nextInt();
int [][] arr = new int [N][N];
for(int i=0;i<N;i++) {
for(int j=0;j<N;j++) {
arr[i][j]=0;
}
}
int i=0;
int j=N/2+1;
arr[i][j]=1;
for(int k=2;k<=N*N;k++) {
i=i-1;//i是列--是向上移动
j=j+1;//往右上角填数,j是行向右移动++
if(i<0) {
i=N-1;
arr[i][j]=k;
}
else if(j>N) {
j=0;
arr[i][j]=k;
}
else if(arr[i][j]!=0) {
i=i+1;
arr[i][j]=k;
}
}
for(int i1=0;i1<N;i1++) {
for(int j1=0;j1<N;j1++) {
System.out.print(arr[i1][j1]+"/t");
}
}
}
}
自己debug 一下就知道了:
参考如下:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[][] arr = new int[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
arr[i][j] = 0;
}
}
int x = 0, y = N / 2; // 初始位置
for (int i = 1; i <= N * N; i++) {
arr[x][y] = i; // 填充当前位置
// 计算下一个位置
int nx = (x - 1 + N) % N;
int ny = (y + 1) % N;
if (arr[nx][ny] == 0) { // 下一个位置为空
x = nx;
y = ny;
} else { // 下一个位置已被填充
x = (x + 1) % N;
}
}
for (int i1 = 0; i1 < N; i1++) {
for (int j1 = 0; j1 < N; j1++) {
System.out.print(arr[i1][j1] + "\t");
}
System.out.println();
}
}