【1304 奇数阶幻方(魔方)构造】
在做题目之前,请先熟悉题目,然后能够填写出7阶和9阶的幻方。
基本思路:如果是n阶幻方,需要填写 n*n个数。本题使用的二维数组范围是[1..n][1..n],而不是使用 [0..n-1][0..n-1]。 将这些数放置到矩阵,有两种可能,在前一个数的右上方(i=i-1, j=j+1),或者下方(i=i+1); 如果出界,则需要做调整。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <stdio.h> int main(int argc, char *argv[]) { int x=7; while (1) { if (x%3==2 && x%5==4) { printf("%d\n", x); break; } x += 14; } return 0; } |
修改成Java,需要做以下调整:
需要修改的C语言部分
1 2 3 4 5 6 7 8 9 10 11 12 | public class P1288 { public static void main(String[] args) { int x=7; while (true) { if (x%3==2 && x%5==4) { System.out.printf("%d\n", x); break; } x += 14; } } } |
修改后的Java部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <stdio.h> int main(int argc, char *argv[]) { int n, k, i, j; const int N=100+10; int a[N][N]; scanf("%d", &n); i= 0; j=(n+1)/2; for (k=1; k<=n*n; k++) { if (k%n==1 || n==1) // n=1 是特殊情况,需要额外处理 i = i+1; else i = i -1, j = j+1; if (i<1) i = i+n; // 出了上边界,往下移 if (j>n) j = j-n; // 出了右边界,往左移 a[i][j] = k; } for (i=1; i<=n; i++) { for (j=1; j<=n; j++) printf("%4d", a[i][j]); printf("\n"); } return 0; } |
完整的程序Java程序
1 2 3 4 | const int N=100+10; int a[N][N]; scanf("%d", &n); printf("%4d", a[i][j]); |