奇数阶魔方问题

问题: 一个 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

回答:

#include<stdio.h>
#include<stdlib.h>
#define max 20
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int a[max][max]={0};
        int i,j,x=1,y,m;
        scanf("%d",&m);
        a[1][(m+1)/2]=1;
        y=(m+1)/2;
        for(i=2;i<=m*m;i++)
        {
            if(x-1>0&&y-1>0)
            {
               x=x-1;
               y=y-1;
               if(a[x][y]==0)
                  a[x][y]=i;
               else {
                 x=(x+2)%m;
                 y=(y+1)%m;
                 if(x==0) x=x+m;
                 if(y==0) y=y+m;
                 a[x][y]=i;
                     }
                   continue;
            }
         if(x-1<=0&&y-1>0)
            {
              x=x-1+m;
              y=y-1;
               if(a[x][y]==0)
                  a[x][y]=i;
            else {
                 x=(x+2)%m;
                 y=(y+1)%m;
                  if(x==0) x=x+m;
                 if(y==0) y=y+m;
                 a[x][y]=i;
                 }
             continue;
            }
         if(x-1>0&&y-1<=0)
            {
             x=x-1;
             y=y-1+m;
             if(a[x][y]==0)
                  {a[x][y]=i;}
             else {
                    x=(x+2)%m;
                    y=(y+1)%m;
                    if(x==0) x=x+m;
                    if(y==0) y=y+m;
                    a[x][y]=i;
                 }
                 continue;
            }
          if(x-1<=0&&y-1<=0)
            {
             x=x-1+m;
             y=y-1+m;
             if(a[x][y]==0)
                  a[x][y]=i;
            else {
                 x=(x+2)%m;
                 y=(y+1)%m;
                 if(x==0) x=x+m;
                 if(y==0) y=y+m;
                 a[x][y]=i;
                 }
              continue;
            }
         }
        for(i=1;i<=m;i++)
        {
            for(j=m;j>=1;j--)
            {
                printf("%4d",a[i][j]);
            }
           printf("\n");
        }
    }
    return 0;
}

时间: 2024-10-19 21:04:17

奇数阶魔方问题的相关文章

Hdu 1998 奇数阶魔方

奇数阶魔方 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4629    Accepted Submission(s): 2622 Problem Description 一个 n 阶方阵的元素是1,2,...,n^2,它的每行,每列和2条对角线上元素的和相等,这样的方阵叫魔方.n为奇数时我们有1种构造方法,叫做"右上方" ,

奇数阶魔方 NYOJ 734

#include<stdio.h>//奇数阶魔方(734) int main() { int a[20][20],i,j,n,x,cnt; scanf("%d",&x); while(x--){ scanf("%d",&n); for(i=0;i<n;i++){ for(j=0;j<n;j++){ a[i][j]=0; } } a[0][n/2]=1; i=0;j=n/2; cnt=1; while(cnt<=n*n){

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

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

hdoj 2183 奇数阶魔方(II) 【模拟】+【规律】

比赛的时候花了一个多小时还是没做出来 分析:观察得到:最中间是(n*n+1)/2, 中间的上面是n*n,下面是1, 左边是n,右面是(n*n+1)-n,而且正对角线是最左上对到最右下端增加(+1),另外一条对角线是最右上到最左下递减(-n) ,其他对角线也是这样的规律. 难点:模拟的时候数据有点杂,很容易搞错,要细心点. 心得:做题的时候要先确定思路是正确的,并且要履好思路之后在敲代码. 代码: #include <cstdio> #include <cstring> int s[

杭电ACM 1998奇数阶魔方

#include<stdio.h>#include <string.h>int main(){ int n,m; int a[40][40]={0}; scanf("%d",&n); while(n--) { scanf("%d",&m); int i; int j; memset(a,0,sizeof(a)); i=0; j=m/2; int k=1; while(k<=m*m) { if(i<0&&am

HDU ACM 1998奇数阶魔方

方法: 1.第一个数填第一行正中间. 2.以后依次往上一行后一列填,并遵循如下规则: a.如果往上超出第一行则往最后一行开始: b.如果往右超出最后一列则往第一列开始: c.右上角填后要往下一行开始,列不变: d.如果所要填数之前已填,则往他下面填. 3.循环第二步,直到方格填满. #include<iostream> using namespace std; int main() { int a[20][20]; int T,n,i,j,k; cin>>T; while(T--)

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阶魔方阵(奇数阵)的输出

需求 要求输出1~n2的自然数构成的魔方阵. STEP 1 什么是魔方阵? 魔方阵,古代又称"纵横图",是指组成元素为自然数1.2-n2的平方的n×n的方阵,其中每个元素值都不相等,且每行.每列以及主.副对角线上各n个元素之和都相等. STEP 2 魔方阵的规律是什么? 此处先写简单一点的奇阶魔方阵,偶数阶的算法更复杂,暂不讨论. 奇阶魔方阵的排列方法: ⑴将1放在第一行中间一列: ⑵从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1: ⑶如果上

奇数阶魔方阵

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