现在的位置: 首页 > 竞赛 > 正文

Top训练营调研试卷试题解析

2012年09月27日 竞赛 ⁄ 共 1020字 ⁄ 字号 暂无评论

【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]);

抱歉!评论已关闭.