2.设计一个4*4魔方程序,让魔方的各行值的和等于各列值的和,并且等于两对角线值得和。例如,以下魔方:
31 3 5 25
9 21 19 15.
17 13 11 23
7 27 29 1
各行、各列以及两对角线值的和都是64.
【提示】:求4*4的魔方的一般步骤如下:
(1)设置初始魔方的起始值和相邻元素之间的差值.例如上述魔方的初始魔方的起始值(first)和相邻元素之间的差值(step)分别为:
first=1; step=2;
(2)设置初始魔方元素的值,例如上述魔方的初始魔方为:
1 3 5 7
9 11 13 15
17 19 21 23
25 27 29 31
(3)生成最终魔方.方法如下:
1)求最大元素值与最小元素值的和sum,该实例的sum是:1+31=32
2)用32减去初始魔方所有对角线上元素的值,然后将结果放在原来的位置,这样就可以求得最终魔方.
本题的魔法类magic的参考框架如下:
class magic
{
public:
voidgetdata();
voidsetfirstmagic();
voidgeneratemagic();
voidprintmagic();
private:
intm[4][4];
intstep;
intfirst;
intsum;
};
#include<iostream>
#include<iomanip>
using namespace std;
class magic
{
public:
void getdata();
void setfirstmagic();
void generatemagic();
void printmagic();
private:
int m[4][4];
int step;
int first;
int sum;
};
void magic::getdata()
{
first=1;
step=2;
}
void magic::setfirstmagic()
{
cout<<"初始的魔方为:"<<endl;
int i,j,k=0;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
m[i][j]=first;
first+=step;
k++;
cout<<setw(4)<<m[i][j];
if(k%4==0)
cout<<endl;
}
}
}
void magic::generatemagic()
{
int sum=0,i=0,j=0;
sum=m[0][0]+m[3][3];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(i==j||i+j==3)
m[i][j]=sum-m[i][j];
}
void magic::printmagic()
{
cout<<"生成最终的魔方为:"<<endl;
int i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
cout<<setw(4)<<m[i][j];
cout<<endl;
}
}
int main()
{
magic mof1;
mof1.getdata();
mof1.setfirstmagic();
mof1.generatemagic();
mof1.printmagic();
system("pause");
return 0;
}