作者:波纹飞鱼
T1142 神奇的幻方
题目
幻方是一个很神奇的N×N矩阵,它的每行、每列与对角线,加起来的数字和都是相同的。我们可以通过以下方法构建一个幻方。(阶数为奇数)
第一个数字写在第一行的中间
下一个数字,都写在上一个数字的右上方:
如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列
如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行
如果该数字在右上角,或者该数字的右上方已有数字,则下一个数字写在该数字的下方
输入格式
一个数字N(N≤20)。
输出格式
按上方法构造的(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;
}