解题思路:
根据N,创建一个N*N的二维数组。按照1 2 3 4.....N*N 的顺观察数组元素的下标。 如下:
以N=5时为例子:
元素的值: 1 2 3 4 5
出现位置下标值(行,列) (4,2) (0,3) (1,4) (2,0) (3,1)
元素的值: 10 9 8 7 6
出现位置下标值(行,列) (1,0) (0,4) (4,3) (3,2) (2,1)
元素的值: 11 12 13 14 15
出现位置下标值(行,列) (0,0) (1,1) (2,2) (3,3) (4,4)
元素的值: 20 19 18 17 16
出现位置下标值(行,列) (2,3) (1,2) (0,1) (4,0) (3,4)
元素的值: 21 22 23 24 25(N*N)
出现位置下标值(行,列) (2,3) (1,2) (0,1) (4,0) (3,4)
//第一个元素1 下标确定 (N-1 , N/2)
//红色坐标均为特殊位置元素的坐标 特殊在 5--6的变换 下标 横坐标减一 纵坐标不变
10--11的变换 下标 横坐标减一 纵坐标不变
15--16的变换 下标 横坐标减一 纵坐标不变
20--21的变换 下标 横坐标减一 纵坐标不变
其他位置元素(i,j) i++; j++;
i==N-1时 i=0; j==N-1 J=0;
注意事项:
自己多调试吧
参考代码:
import java.util.Scanner;
public class A1188幻方 {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int N = sc.nextInt();
if (N == 0)
break;
int a[][] = new int[N][N];
int i = N - 1;// 行
int j = N / 2;// 列
int n = 1;
a[i][j] = n;
while (n < N * N) {
if (n % N != 0) {
if (i == N - 1) {
i = 0;
} else {
i++;
}
if (j == N - 1) {
j = 0;
} else {
j++;
}
} else {
i = i - 1;
}
n = n + 1;
a[i][j] = n;
}
for (int p = 0; p < N; p++) {
for (int q = 0; q < N; q++) {
if (N * N < 10) {
System.out.printf("%d ", a[p][q]);
} else if (N * N > 10 && N * N < 100) {
System.out.printf("%2d ", a[p][q]);
} else {
System.out.printf("%3d ", a[p][q]);
}
}
System.out.println("");
}
System.out.println("");
}
}
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复