奇数魔方阵
(输入文件:input.txt 输出文件:output.txt)
魔方矩阵是一个n*n奇数矩阵,其中n^2个元素分别是1,2,3,4,5…,n^2。魔方矩阵的特点是:任意一行、任意一列以及主副对角线的所有数之和均相等,且都等于n(n^2+1)/2,如下图所示的三阶魔方矩阵
8 | 1 | 6 |
3 | 5 | 7 |
4 | 9 | 2 |
小明已经研究出摆放矩阵中数字规则如下:
1、数字1在矩阵第一行中间一列;
2、从数字2到n^2的各个数依次存放在前一个数的又上角的位置、
3、若上一个数在第一行,下一个数在最后一行,若上一个数在最后一列,下一个数字第一列。
4、按上述规则放置,如果已经有数了就放在上一个数的正下方。
数据输入:
输入有多个数据,每个数据n占一行(n<21,并且n是奇数)。
数据输出:
对应每个输入数据,输出对应的魔方矩阵。
样例输入:
5
3
样例输出:
17 24 1 8 1523 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
8 1 6
3 5 7
4 9 2
分析:其实解题思路很简单按照给出的规则对二维数组进行填写后输出就可以了!
#include"stdio.h"
#include"fstream"
#include"iostream"
using namespace std;
//ifstream fin("input.txt");
//ofstream fout("output.txt");
int main()
{
int a[21][21] = {0};
int n;
freopen("input.txt", "r", stdin); //修改输入指向
freopen("output.txt", "w", stdout); //修改输出指向
while ((cin >> n)&&n!=EOF) //多组数据,判断输入是否到了文件末尾
{
int i = 0,j = n / 2 ; //i j,分别表示数字的行和列
for (int r = 1; r <= n*n; r++)
{
if (a[i][j] == 0) //如果等于0表示该位置没有数字
{
a[i][j] = r;
}
else //表示该位置已经有数字,于是填写在上一个数字的下方
{
i = (i + 2) % n; //%n以保证不会超出界限
j = j == 0 ? n - 1 : j - 1; //定为到上一个数字的下方
a[i][j] = r; //填写数字
}
i = i==0 ? n - 1 : i - 1; //定为下一次的位置
j = (j +1) % n; //%n以保证不会超出界限
}
for (i = 0; i < n; i++) //打印二维表
{
for (j = 0; j < n; j++)
{
printf("%3d", a[i][j]);
a[i][j] = 0; //赋值为0保证下一组数据的正确执行
}
cout << endl;
}
}
// system("pause");
return 0;
}