神奇的幻方(C语言)

[NOIP2015 提高组] 神奇的幻方

今天我来给大家分享一道洛谷题目,神奇的幻方,我第一次遇到它大概是半年前,但是那时候我对于这道题没有任何思路,但是现在我可以将这道题做出来了。

怎么说呢,先说一下这个方盘怎么放数字的,这个盘子方数字的大体顺序是从左下到右上,到头了就换一条斜线,也就是题目中的第4种情况。前3种情况就是在进行换斜线,并保证遍历过的斜线不在重复遍历。
接下来就是代码了:

#include
int main(void){
    int a[40][40], n;  //建立一个二维数组模拟幻方的盘子(我将其称为盘子)
    int i, j, t = 1;
    scanf("%d", &n);
    for (i = 0; i <= n; i++) {
		for (j = 0; j <= n; j++) {
			a[i][j] = 0;   //初始化二维数组
		}
	}
	i = 1;
    j = (n + 1) / 2;
	a[i][j] = 1;
    t++;
    while (t <= n * n) {   //总共有n*n个数字
        if (i == 1 && j != n) {   
            i = n;
            j = j + 1;
			a[i][j] = t;
            t++;
            continue;
        }
		if (j == n && i != 1) {
            i = i - 1;
            j = 1;
			a[i][j] = t;
            t++;
            continue;
        }
		if (i == 1 && j == n) {
            i = i + 1;
            j = j;
			a[i][j] = t;
            t++;
            continue;
        } 
		if (i != 1 && j != n){
            if (a[i - 1][j + 1] == 0) {
                i = i - 1;
                j = j + 1;
				a[i][j] = t;
                t++;
                continue;
            } else {
                i = i + 1;
                j = j;
				a[i][j] = t;
                t++;
                continue;
            }
        }
    }
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= n; j++) {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

最后呢,进行一个小小的总结,关于这道题的代码,并没有什么新鲜的地方,比较难理解的就是放数的规则,要是还理解不了,我这呢,建议画一下图,画完图就可能理解了。

通过这道题目,我们在做题可以用画图的方法来模拟题述的过程,来找到其中的规律。其次,我们可以利用我们学过的二维数组来进行平面空间的模拟,也可以用三维数组来弄一个立体空间。

你可能感兴趣的:(神奇的幻方(C语言))