设计一个4*4魔方程序,让魔方的各行值的和等于各列值的和,并且等于两对角线值的和64.例如以下魔方:
1 3 5 7
9 11 13 15
17 19 21 23
25 27 29 31
【详解】
求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)生成最终魔方.方法如下:
①求最大元素值与最小元素值的和sum,该实例的sum是:
1+31=32
②用32减去初始魔方所有对角线上元素的值,然后将结果放在原来的位置,这样就可求得最终魔方.本例最终魔方如下:
31 3 5 25
9 21 19 15
17 13 11 23
7 27 29 1
#include<iostream>
using namespace std;
#include <iomanip>
class magic
{
private:
int m[4][4];
int step; //相邻元素之间的差值
int first; //起始值
int sum; //最大元素值与最小元素值的和
public:
void getadata();//输入初值成员函数
void setfirstmagic(); //设置初始魔方成员函数
void generatemagic(); //设置最终魔方成员函数
void printmagic(); //显示魔方成员函数
};
void magic::getadata() //输入初值成员函数
{
cout << "输入4*4魔方起始值:";
cin >> first;
cout << "输入相邻元素差值:";
cin >> step;
}
void magic::setfirstmagic() //设置初始魔方成员函数
{
int i, j;
int tmp;
tmp = first;
for(i=0;i<4;i++)
for (j = 0; j < 4; j++)
{
m[i][j] = tmp;
tmp += step;
}
}
void magic::generatemagic() //生成最终魔方成员函数
{
sum = m[0][0] + m[3][3];
for (int i = 0, j = 0; i < 4; i++, j++)
m[i][j] = sum - m[i][j];
for (int i = 0, j = 3; i < 4; i++, j--)
m[i][j] = sum - m[i][j];
}
void magic::printmagic()
{
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
cout<< setw(7) <<m[i][j];
cout << endl;
}
}
int main()
{
magic A;
A.getadata();
A.setfirstmagic();
cout << "初始魔方如下:" << endl;
A.printmagic();
A.generatemagic();
cout << "最终魔方如下;" << endl;
A.printmagic();
return 0;
}