【ZZULIOJ】1203: 做幻方

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weclove2008/article/details/78088098

题目

1203: 做幻方

​ Time Limit: 1 Sec Memory Limit: 128 MB Submit: 388 Solved: 89
(https://acm.zzuli.edu.cn/zzuliacm/bbs.php?pid=1203)

Description

Apple最近迷上了做幻方,Apple还是个中高手,只要你说个奇数N就能把N*N的幻方做出来。其实你可以比他做得更好的。Apple总是画得很乱,而你可以利用程序排得很整齐^_^ 幻方的要求:每一行,每一列,还有两条斜线上数字的和都相等.

Input

每行一个奇数N(0< N < 30),输入0结束

Output

输入一个奇数,输出一个幻方,顺序参照样板输出;同一列的数右对齐,数与数用一个空格分开;输出完以后加一个回车。

Sample Input

510

Sample Output

11 18 25 2 9

10 12 19 21 3

4 6 13 20 22

23 5 7 14 16

17 24 1 8 15

1

HINT

Source

思路

​ N 为奇数时,最简单:

⑴ 将1放在第一行中间一列;

⑵ 从2开始直到n×n止各数依次按下列规则存放:

按 45°方向行走,如向右上

每一个数存放的行比前一个数的行数减1,列数加1

⑶ 如果行列范围超出矩阵范围,则回绕。

例如1在第1行,则2应放在最下一行,列数同样加1;

⑷ 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,

则把下一个数放在上一个数的下面。

例如:3阶的幻方

8 1 6

3 5 7

4 9 2

1.确定1的位置 累加1;

2.优先将值赋给自己右上角的位置(n为阶数-1)

特殊:如果右上角行下标<0 则赋值给同列最下面的位置

特殊:如果右上角列下表>n 则赋值给同行最左边的位置

3.如果上述位置被占领,则赋值给自己下面(行数不变列数+1;

代码

#include<stdio.h>
#include<math.h>
#define N 30
int sqr(int m);

int main()
{
    int m;
    while(scanf("%d", &m), m != 0)
    {
        sqr(m);
    }
    return 0;
}

int sqr(int m)
{
    int a[N][N] = {0};
    int x=0, y=0;
    int times, p, q, fmt;
    int i, j;
    x = m / 2;
    y =  m - 1;
    times = m * m;
    for(i = 0 ; i < times ; i++)
    {
        a[y][x] = i + 1;
        p = x;
        q = y;
        x = x + 1;
        if(x == m)
            x = 0;

        y = y + 1;
        if(y == m)
            y = 0;

        if(a[y][x] != 0)
        {
            x = p;
            y = q - 1;
        }
    }

    fmt = log10(times);
    if(fmt == 0)
    {
        for(i = 0 ; i < m ; i++)
        {
            for(j = 0 ; j < m - 1 ; j++)
            {
                printf("%d ", a[i][j]);
            }
            printf("%d", a[i][m - 1]);
            printf("\n");
        }
    }
    else if(fmt == 1)
    {
            for(i = 0 ; i < m ; i++)
        {
            for(j = 0 ; j < m - 1 ; j++)
            {
                printf("%2d ", a[i][j]);
            }
            printf("%2d", a[i][m - 1]);
            printf("\n");
        }
    }
    else if(fmt == 2)
    {
            for(i = 0 ; i < m ; i++)
        {
            for(j = 0 ; j < m - 1; j++)
            {
                printf("%3d ", a[i][j]);
            }
            printf("%3d", a[i][m - 1]);
            printf("\n");
        }
    }
    printf("\n");
    return 0;
}

U

猜你喜欢

转载自blog.csdn.net/weclove2008/article/details/78088098