-
总时间限制:
- 1000ms 内存限制:
- 65535kB
-
描述
-
幻方是一个很神奇的N*N矩离,它的每行、每列与对角线,加起来的数字都是相同的。
我们可以通过以下方法构建一个幻方。(阶数为奇数)
1.第一个数字写在第一行的中间
2.下一个数字,都写在上一个数字的右上方。
3.如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列
4.如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行
5.如果该数字在右上角,或者该数字的右上方已有数字,则下一个数字写在该数字的下方
输入
- 一个数字N(N<=20) 输出
- 按上方法构造的2N-1 * 2N-1的幻方 样例输入
-
3
样例输出
-
17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
#include <iostream>
using namespace std;
int main()
{
int array[55][55];
for (int i = 0; i <= 54; i ++)
for (int j = 0; j <= 54; j ++)
{
array[i][j] = 0;
}
int N;
cin >> N;
int x, y;
int count = 1;
int flag;
x = 1;
y = N;
array[x][y] = 1;
while (1)
{
if (count == (2 * N - 1) * (2 * N - 1))
break;
if (x == 1 && y != 2 * N -1)
{
if (array[2 * N - 1][y + 1] == 0)
{
x = 2 * N - 1;
y = y + 1;
array[x][y] = ++count;
continue;
}
else
{
x = x + 1;
array[x][y] = ++count;
continue;
}
}
if (x != 1 && y == 2 * N -1)
{
if (array[x - 1][1] == 0)
{
x = x - 1;
y = 1;
array[x][y] = ++count;
continue;
}
else
{
x = x + 1;
array[x][y] = ++count;
continue;
}
}
if (x == 1 && y == 2 * N -1)
{
x = x + 1;
array[x][y] = ++count;
continue;
}
if (array[x - 1][y + 1] == 0)
{
x = x - 1;
y = y + 1;
array[x][y] = ++count;
}
else
{
x = x + 1;
array[x][y] = ++count;
}
}
for (int i = 1; i <= 2 * N -1; i ++)
{
flag = 0;
for (int j = 1; j <= 2 * N - 1; j ++)
{
if (flag == 1)
{
cout << " ";
}
cout << array[i][j];
flag = 1;
}
cout << endl;
}
return 0;
}