魔方数即一个二维数组 ,各横排竖排,对角线的和为相等的常数,我们将用c++编写一个可以求任意奇数维度的魔方数数组。
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
int main()
{
//二维向量
cout<<"请输入你想要的维度"<<endl;
int weidu=0;
cin>>weidu;
vector<int> mo(weidu,0);
vector <vector<int> > mofang(weidu,vector<int> (weidu,0));
//赋值
int a=1;
int q=((weidu+1)/2)-1;//列
int q2=0;//行
int w=q;int w2=q2;
while(1){
if(a==1){
mofang[q2][q]=a;
a++;continue;//第一个数
}
if(a>=2){
if(a==weidu*weidu+1){
break;}
if(q2==0&&q==weidu-1)//右上角的数
{
q2=1;
mofang[q2][q]=a++;
continue;
}
if(q2-1<0){//触碰上边界
w2=weidu-1;//最下面一行
}
if(q2-1>=0){//不触碰,往上一行
w2=q2-1;
}
if(q+1>=weidu)//触碰右边界
{
w=0;//第一列去
}
if(q+1<weidu){
w=q+1;//不触碰,右移一行
}
if(mofang[w2][w]!=0){//该处有元素
q2=q2+1;//下一行
mofang[q2][q]=a++;
continue;
}
if(mofang[w2][w]==0){//无元素,则赋值为a+1
q2=w2;q=w;
mofang[q2][q]=a++;
continue;
}
}
}
//输出
for(int i=0;i<weidu;i++)
{
for(int j=0;j<weidu;j++)
{
cout<<setfill(' ')<<setw(3)<<left<<mofang[i][j];
}cout<<endl;
}
return 0;
}