啊,好累。你写的程序(还是老谭写的?)我就不看了,单看算法,随便凑出一个来,
3×3的矩阵没有问题,其它的就不知道了。
我看了一下,这个算法好像是生成奇数阶矩阵的算法,偶数阶矩阵是另外的算法。
程序代码:#include
#include
#define MAX_NUM 5
int main()
{
int rows = 0, center = 0, iArray[MAX_NUM][MAX_NUM];
int RowSet = 0, LineSet = 0, newRowSet = 0, newLineSet = 0;
int i = 0, j = 0;
int okNum = 0;
// set the items of array "iArray" to be 0
for ( i = 0; i < MAX_NUM; i++ )
for ( j = 0; j < MAX_NUM; j++ )
iArray[i][j] = 0;
// get the rows number
while ( 1 )
{
printf("输入行数:\n");
scanf("%d", &rows);
if ( rows <= MAX_NUM )
{
rows -= 1;
break;
}
else {
printf("行数必须在 0 和 %d 之间, 请重新", MAX_NUM);
}
}
// set number '1'
center = rows / 2;
iArray[0][center] = 1;
// initialize the okNum, RowSet and LineSet
okNum = 1;
RowSet = 0;
LineSet = center;
// set each item in "iArray"
while ( okNum < (rows + 1) * (rows + 1) )
{
if ( RowSet == 0 && LineSet == rows )
{
RowSet += 1;
}
else {
newRowSet = (RowSet == 0) ? rows : RowSet - 1;
newLineSet = (LineSet == rows) ? 0 : LineSet + 1;
if ( iArray[newRowSet][newLineSet] != 0 )
// there is already a number here!
{
RowSet = (RowSet == rows) ? 0 : RowSet + 1;
//RowSet += 1;
}
else{
RowSet = newRowSet;
LineSet = newLineSet;
}
}
iArray[RowSet][LineSet] = ++okNum;
}
// print the "iArray"
for ( i = 0; i <= rows; i++ )
{
for ( j = 0; j <= rows; j++ )
printf("%5d", iArray[i][j]);
printf("\n");
}
system("pause");
return 0;
}
[[italic] 本帖最后由 zbqf109 于 2007-12-2 09:38 编辑 [/italic]]