/*---------------------------------------------------------------------------
File name: 奇数幻方阵.c
Author: HJin (email: fish_sea_bird [at] yahoo [dot] com )
Created on: 9/19/2007 07:31:09
Environment: Windows XP Professional SP2 English +
Visual Studio 2005 v8.0.50727.762
Modification history:
===========================================================================
Problem statement:
---------------------------------------------------------------------------
https://bbs.bc-cn.net/viewthread.php?tid=171321
奇数幻方阵的算法:
1) 首先确定第一个数的位置,它在第一行的中间
2) 下一个数的位置在当前数的左上方,即行号减1,列号减1:
* 若该位置行号小于1,则放在该列最后一行;
*若该位置列号小于1,则放在该行最后一列;
*若该位置行列号均小于1,或若该位置已有数,则放在当前数的正下方;
3)重复2),直到所有数都一放好;
*/
#include <stdio.h>
#include <stdlib.h>
#define MAX 101
int a[MAX][MAX];
int main()
{
int i, j, n, c, n2;
while (scanf("%d", &n) == 1)
{
if (n == -1)
{
break;
}
if ((n& 1) == 0)
{
puts("n must be an odd integer");
continue;
}
for (i = 1; i <= n; ++i)
{
for (j = 1; j <= n; ++j)
{
a[i][j] = 0;
}
}
i = 1;
j = n / 2+1;
a[i][j] = 1;
n2 = n * n;
for (c = 2; c <= n2; ++c)
{
--i;
--j;
if ((i < 1 && j < 1) || (a[i][j] != 0))
{
i += 2;
++j;
}
else if (i < 1)
{
i = n;
}
else if (j < 1)
{
j = n;
}
a[i][j] = c;
}
for (i = 1; i <= n; ++i)
{
for (j = 1; j <= n; ++j)
{
printf("%-4d ", a[i][j]);
}
printf("\n");
}
}
return 0;
}