hdu1998 奇数阶魔法 (数组填数)

奇数阶魔方

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 3071    Accepted Submission(s): 1614

Problem Description

一个 n 阶方阵的元素是1,2,...,n^2,它的每行,每列和2条对角线上元素的和相等,这样

的方阵叫魔方。n为奇数时我们有1种构造方法,叫做“右上方” ,例如下面给出n=3,5,7时

的魔方.

3

8 1 6

3 5 7

4 9 2

5

17 24 1 8 15

23 5 7 14 16

4 6 13 20 22

10 12 19 21 3

11 18 25 2 9

7

30 39 48 1 10 19 28

38 47 7 9 18 27 29

46 6 8 17 26 35 37

5 14 16 25 34 36 45

13 15 24 33 42 44 4

21 23 32 41 43 3 12

22 31 40 49 2 11 20

第1行中间的数总是1,最后1行中间的数是n^2,他的右边是2,从这三个魔方,你可看出“右

上方”是何意。

Input

包含多组数据,首先输入T,表示有T组数据.每组数据1行给出n(3<=n<=19)是奇数。

Output

对于每组数据,输出n阶魔方,每个数占4格,右对齐

Sample Input

2
3
5

Sample Output

   8   1   6
   3   5   7
   4   9   2
  17  24   1   8  15
  23   5   7  14  16
   4   6  13  20  22
  10  12  19  21   3
  11  18  25   2   9

Author

[email protected]

Source

ECJTU 2008 Spring Contest

Recommend

lcy   |   We have carefully selected several similar problems for you:  1994 1996 1995 1999 1997

这道题怎么说呢,当我看到这种题的第一眼就是肯定是找规律,而且整个数组都遵循。。

因为你要编程序吧。。肯定不会太复杂的规律。。所以就花费了5分钟找到规律。

拿n=5为例子,a[0][n/2]=1,a[n-1][n/2]=n*n,a[n-1][n/2+1]=2.然后你会发现3在2的右上方

5在4的右上方6在5的正下方。。。等等。。我们就会发现假如m在a[x][y]位置,那么m+1就在a[x-1][i+1]位置(当然其它条件都满足的情况下),

至于其它条件不满足的情况,就是a[x-1][i+1]上面已经有数,那么m+1应该在m的下面。还有如果m在a[x][n-1],那么m+1就在a[x-1][0].如果m

在a[0][y]那么m+1就在a[n-1][y+1]。如果m在a[0][n-1],m+1也在m的下面。

附上代码吧:

#include <stdio.h>
#include <string.h>
int main()
{
    int map[20][20],ncase,n;
    scanf("%d",&ncase);
    while(ncase--)
    {
        memset(map,0,sizeof(map));
        scanf("%d",&n);
        map[n-1][n/2]=n*n;
        map[0][n/2]=1;
        int t=2;
        int i=n-1,j=n/2+1;
        while(t<n*n)
        {
            if(!map[i][j]&&i>=0&&i<n&&j<n&&j>=0)
            map[i][j]=t,i--,j++,t++;
            else
            {
                if(i<0&&j<n)
                i=n-1;
                else if(i>=0&&j==n)
                j=0;
                else
                i+=2,j--;
            }
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            printf("%4d",map[i][j]);
            printf("\n");
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-03 09:03:24

hdu1998 奇数阶魔法 (数组填数)的相关文章

&lt;蛇形填数&gt;--算法竞赛 入门经典(第2版)- 3.1 数组 程序3-3 蛇形填数

 蛇形填数: 在n×n方阵里填入1,2,....,n×n,要求填成蛇形.例如,n = 4 时方阵为:   10  11  12  1   9  16  13  2 8  15  14  3 7   6    5   4 上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出.n <= 8 . 类比上面这种数学中的矩阵,我们可以考虑使用一个二维数组来储存. 解题思路:从右上角开始往下填数,当到底的时候转向左填值,当到左边的边的时候转向上填数,当到最上面的时候转向右填值...依次类推.第一轮转圈

nyoj 33 蛇形填数【循环+数组】

蛇形填数 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为: 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4 输入 直接输入方陈的维数,即n的值.(n<=100) 输出 输出结果是蛇形方陈. 样例输入 3 样例输出 7 8 1 6 9 2 5 4 3 来源 算法经典 上传者 首席执行官 思路: 通过while循环来控制走向(下,左,上,右),并将每一步的结果(结果

nyoj 852 蛇形填数(二)【循环+数组】

蛇形填数(二) 时间限制:2000 ms  |  内存限制:65535 KB 难度:3 描述 1 2 3 4 5 12 13 14 6 11 15 7 10 8 9 跟蛇形填数一样,只是填数要求按照三角形填.注意每组数据之间用空行隔开 输入 第一行有一个N,表示N组测试数据 接下来每组数据包括一个数字X,表示三角形的边长,0< X <1000 输出 输出之后填好之后的图 样例输入 2 5 4 样例输出 1 2 3 4 5 12 13 14 6 11 15 7 10 8 9 1 2 3 4 9

【基础题】蛇形填数

题目描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为: 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4 输入 直接输入方阵的维数,即n的值.(n<=100) 输出 输出结果是蛇形方陈. 样例输入 3 样例输出 7 8 1 6 9 2 5 4 3 先说一下我的思路,我把n=4时的情况列了出来,发现了奇数时,j变化,偶数时,i变化等变化规律,后来我发现需要总结很多变化规律才能算数来,总结出了n=4的,n=5时又不一样了,哎,头疼(小白的思

Java 实现奇数阶幻方的构造

一.设计的流程图如下所示 二.Java 语言的代码实现 package MagicSquare; //奇数幻方的实现 public class Magic_Odd { //n 为幻方的阶数 public static int[][] magicOdd(int n) { //构造一个(n+2)*(n+2)阶的方阵 int[][] square = new int[n + 1][n + 1]; int i = 0; int j = (n + 1) / 2; //从第一行的中间那个数字(是1)开始填幻

蛇形填数之斜着排

/* 题目大意:填数 解题思路:模拟填数的过程 难点详解:模拟填数的过程考虑清楚即可 关键点:如何填数,如何控制填数的次数 解题人:lingnichong 解题时间:2014/08/16    12:40 解题体会:是蛇形填数的另外一种变形 */ 奇数阶魔方 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 4   Accepted Subm

求N奇数阶幻方

1. 如果矩阵满足条件,那么对任意,也满足条件.证明显然. 设为奇数,我们现在构造一个n阶幻方包含0到所有数这里x,y满足同余式待确定. 由于该方程组的系数矩阵的行列式为1,所以对任意i,j有唯一解.我们接下来确定a,b: 首先验证每行每列的和均相等,即 由于对任意i,,当x取遍模n的剩余类时,也会取遍所有的剩余类 故每行的和为:同理验证每列. 对于对角线:令b = n - 1, a = (n-1)/2,可以验证y = (n - 1)/2, x = i所以其和为:n*(0 + ... n - 1

算法:九宫格问题--奇数阶魔方(Magic-Square)

一.魔方介绍 魔方(这里是简称,也可以叫幻方.魔术矩阵,Magic Square)是 n×n 正方形网格(n 为每侧的单元数),里面每个单元格填充了不同的正整数 1, 2, 3, ... , n2,并且每一行.每一列和对角线中的正整数之和相等.每行.每列以及对角线上的单元格里的正整数之和又叫做魔术常数或魔方的魔术和. 幻方历史: <系辞>云:“河出图,洛出书,圣人则之.”在宋朝之前,洛书的记述只有文字. 九宫图实物最早发现于西汉,1977年中国考古学家在安徽阜阳县双古堆西汉古墓中发现汉文帝七年

奇数阶魔方阵

原题 打印魔方阵,魔方阵是指这样的方针,每一行.每一列以及对角线的和相等.例如三阶魔方阵: 8 1 6 3 5 7 4 9 2 编程打印奇数阶魔方阵. 提示 问题解决的关键是元素的填充,第一个元素1的位置在第一行正中,新的位置应该处于最近插入元素的右上方:但如果右上方的位置超出方针上边界,则新的位置应该取列的最下一个位置:超出右边界则取行的最左的一个位置:若最近插入的元素为n的整数倍,则选下面一行同列上的位置为新的位置. 实现代码 /*******************************