6 1 8
7 5 3
2 9 4
奇数幻方阵的算法:
1) 首先确定第一个数的位置,它在第一行的中间
2) 下一个数的位置在当前数的左上方,即行号减1,列号减1:
* 若该位置行号小于1,则放在该列最后一行;
*若该位置列号小于1,则放在该行最后一列;
*若该位置行列号均小于1,或若该位置已有数,则放在当前数的正下方;
3)重复2),直到所有数都一放好;
/*---------------------------------------------------------------------------
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:
---------------------------------------------------------------------------
http://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;
}
[此贴子已经被作者于2007-9-20 0:15:44编辑过]
应该写的面向对象一点,程序不具括展性,只顾解决问题`~~~
我也写了一个,可能我的还能简单点。。。。自己懒得改了!
#include<iostream.h>
#include<math.h>
#define N 9
#define m 3
void fun(int a[], int b[][m])
{
int i=0,k=m/2;
int j = 0;
while(j<N)
{
if(j==0)
{
b[i][k] = a[j++];
i--,k--;
continue;
}
if((i<0 && k<0) || (i>=0 && k>=0 && b[i][k]))
{
i += 2;
k++;
b[i][k] = a[j++];
i--,k--;
}
else
{
if(i<0)
{
i = m-1;
b[i][k] = a[j++];
i--,k--;
}
else
if(k<0)
{
k = m-1;
b[i][k] = a[j++];
i--,k--;
}
else
{
b[i][k] = a[j++];
i--,k--;
}
}
}
}
void show(int b[][m])
{
int i,j;
for(i=0; i<m; i++)
{
for(j=0; j<m; j++)
cout << b[i][j] << '\t';
cout << endl;
}
}
void main()
{
int a[N] = {1,2,3,4,5,6,7,8,9};
int b[3][3]={0};
fun(a,b);
show(b);
}