您的位置:首页 > 运维架构

openjudge 数算练习 线性表 0217:神奇的幻方

2014-10-10 12:15 267 查看
总时间限制: 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: