时间限制 | 11 秒/Second(s) | 内存限制 | 512512 兆字节/Megabyte(s) |
题目描述
Apple最近迷上了做幻方,Apple还是个中高手,只要你说个奇数N就能把N*N的幻方做出来。其实你可以比他做得更好的。Apple总是画得很乱,而你可以利用程序排得很整齐^_^ 幻方的要求:每一行,每一列,还有两条斜线上数字的和都相等.
输入
每行一个奇数N(0< N < 30),输入0结束
输出
输入一个奇数,输出一个幻方,顺序参照样板输出;数与数用一个空格分开;输出完以后加一个回车。
样例输入复制
5 1 0
样例输出复制
11 18 25 2 9 10 12 19 21 3 4 6 13 20 22 23 5 7 14 16 17 24 1 8 15 1
介绍:
⑴ 将1放在第一行中间一列;
⑵ 从2开始直到n×n止各数依次按下列规则存放:
按 45°方向行走,如向右下
每一个数存放的行比前一个数的行数减1,列数加1
⑶ 如果行列范围超出矩阵范围,则回绕。
例如1在第1行,则2应放在最上一行,列数同样加1;
⑷ 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,
则把下一个数放在上一个数的上面。
按上述规则的3×3幻方如表。
4 | 9 | 2 |
3 | 5 | 7 |
8 | 1 | 6 |
#include<iostream>
#include <algorithm>
#include<cstring>
using namespace std;
int n;
void func()
{
int a[n][n];
memset(a, 0, sizeof(a));
int x=n-1,y=n/2;
for(int i=1;i<=n*n;i++)
{
a[x][y]=i;
x++;y++;
if(x>=n)//x越界
{
if(y>=n)
{
x-=2;y--;
}
else if(a[x%n][y]==0)
{
x%=n;
}
}
else if(y>=n)//y越界
{
y%=n;
}
else if(a[x][y]!=0)//右下角有数
{
x-=2;y--;
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("%d ", a[i][j]);
}
cout << endl;
}
}
int main()
{
while (cin >> n)
{
if(n==0)return 0;
func();
cout << endl;
}
return 0;
}