解题思路:
根据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++代码)浏览:834 |
C语言程序设计教程(第三版)课后习题9.6 (C语言代码)浏览:287 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:668 |
三角形 (C++代码)递归(存在大量重复计算,容易出现时间超限)浏览:836 |
循环入门练习6 (C语言代码)浏览:1058 |
蚂蚁感冒 (C语言代码)浏览:816 |
数组输出 (C语言代码)浏览:749 |
C语言程序设计教程(第三版)课后习题12.6 (C语言代码)浏览:732 |
C语言程序设计教程(第三版)课后习题10.7 (用指针求解)浏览:1542 |
青年歌手大奖赛_评委会打分 (C语言代码)浏览:2248 |