T1142 神奇的幻方

作者:波纹飞鱼

T1142 神奇的幻方

题目

幻方是一个很神奇的N×N矩阵,它的每行、每列与对角线,加起来的数字和都是相同的。我们可以通过以下方法构建一个幻方。(阶数为奇数)
第一个数字写在第一行的中间
下一个数字,都写在上一个数字的右上方:
如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列
如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行
如果该数字在右上角,或者该数字的右上方已有数字,则下一个数字写在该数字的下方

输入格式

一个数字NN≤20)。

输出格式

按上方法构造的(2N−1)×(2N−1)的幻方。

解题

一,流程图

Created with Raphaël 2.2.0 开始 输入一个数字N 构建(2N−1)×(2N−1)的幻方 输出幻方 结束

二,提取关键点

1.构建幻方

三,解决关键点

1.构建幻方

定义一个二维数组,根据题目所给的奇数阶幻方口诀,在相应位置存储依次递增的数值,最后再将二维数组输出。

奇数阶幻方
设行为x,列为y
1.本数字在(x,y),一般情况,下一个数字存储在(x-1,y+1)。
2.本数字在矩阵右上角,下一个数字存储在(x+1,y)。
3.本数字在矩阵第一行,下一个数字存储在(x最后一行,y+1)。
4.本数字在矩阵最后一列,下一个数字存储在(x-1,y第一列)。
5.按照第一条移动后,但本处已被赋值,下一个数字存储在移动后的(x+2,y-1)。

编程

#include<iostream>
using namespace std;
int main()
{
    int a[40][40]={0};
    int N,n,i,j;
    cin>>N;
    n=2*N-1;
    int x=1,y=n/2+1;
    a[x][y]=1;
    for(int i=2;i<=n*n;i++){
        if(x==1&&y==n){x=2;y=n;}
        else if(x==1){x=n;y=y+1;}
        else if(y==n){x=x-1;y=1;}
        else{x=x-1;y=y+1;}
        if(a[x][y]!=0){x=x+2;y=y-1;}
        a[x][y]=i;
    }
    for(i=1;i<n+1;i++){
        for(j=1;j<n+1;j++){
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}
发布了44 篇原创文章 · 获赞 50 · 访问量 7193

猜你喜欢

转载自blog.csdn.net/lz28noi/article/details/104337069