神奇矩阵:
| 2 | 9| 4 |
| 7 | 5 | 3 |
| 6 | 1 | 8 |
令矩阵的每行每列之和都为15:
解法:2, 4, 6, 8,这四个数,正好占据了矩形的四个角,我们采用填充方法将方格填完
填充规律:在第一行中间填1,然后1的右上角即为2的位置(行越界则移动到最后一行,2的右上角
即为3的位置,一直到碰到已填的数字为止)此时数字向下填,填好后将次序列进行如反转和镜像即完成。
#include<iostream>
using namespace std;
int a[3][3],b[3][3];
int main()
{
int i,tx,ty;
int x=0,y=1;
a[0][1]=1;//将1放在第0行第1列
for(i=2;i<=9;i++)//依次放2->9
{
tx=(x+1)%3;
ty=(y+1)%3;
if(a[tx][ty]==0)//如果斜上未填数字
{
a[tx][ty]=i;//x为行,y为列
x=tx;
y=ty;
}
else//否则填数到下方
{
x=(x+1)%3;
a[x][y]=i;
}
}
for(i=0;i<=3;i++)
{
cout<<a[0][0]<<a[0][1]<<a[0][2]<<endl;
cout<<a[1][0]<<a[1][1]<<a[1][2]<<endl;
cout<<a[2][0]<<a[2][1]<<a[2][2]<<endl;
cout<<endl;
cout<<a[2][0]<<a[2][1]<<a[2][2]<<endl;//上下翻转
cout<<a[1][0]<<a[1][1]<<a[1][2]<<endl;
cout<<a[0][0]<<a[0][1]<<a[0][2]<<endl;
cout<<endl;
for(int ii=0;ii<3;ii++)//借助辅助数组b进行旋转
for(int jj=0;jj<3;jj++)
b[jj][2-ii]=a[ii][jj];
for(int ii=0;ii<3;ii++)
for(int jj=0;jj<3;jj++)
a[ii][jj]=b[ii][jj];
}
system("pause");
return 0;
}