/*
* 求解数据结构为矩阵。
*
* 具体操作步骤如下:
* 【1】首先将 1 放在最上边一行正中间,然后将下一个整数放在右上方;
* 【2】如果到达最上一行,下一个整数就放在最后一行,列位置不变;
* 【3】如果到达最右端,则下一个数放在最左端,行位置不变;
* 【4】当到达的方格中已经填上数字时,下一个整数就放在刚填的那个数字方格的正下方。
*/
#include <stdio.h>
#include <stdlib.h>
void magic(int n) {
// 判断输入参数是否合法
if(n < 0 || n % 2 == 0){
return;
}
int rowSum = 0;
int i = 0,j = 0;
int ni = 0,nj = 0;
int k = 0;
// 待填入的整数
int nn = n * n;
//动态申请二维数组
int ** magicVector = (int **)malloc(n * sizeof(int));
for(i=0;i<n;i++){
magicVector[i] = (int *)malloc(n * sizeof(int));
}
//初始化二维数组
for(i=0;i<n;i++){
for(j=0;j<n;j++){
magicVector[i][j] = 0;
}
}
//初始话数组索引
i = 0; j = n / 2;
for(k=1;k<=nn;k++){
magicVector[i][j] = k;
if(i == 0)
ni = n - 1;
else
ni = i - 1;
if( j == (n-1))
nj = 0;
else
nj = j + 1;
if(magicVector[ni][nj] == 0){
i = ni;
j = nj;
}else{
i++;
}
//j = nj;
}
//打印输入二维数组
printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%4d",magicVector[i][j]);
}
printf("\n");
}
for(i=0;i<n;i++){
rowSum += magicVector[0][i];
}
printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
printf("The sum of row or line or cross is %d\n",rowSum);
printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
}
int main() {
int row = 0;
while(1){
printf("\nPlease input row or col of MagicMatrix(#0 to quit#)\n");
printf(">>>");
scanf("%d",&row);
if(row == 0)
break;
magic(row);
}
return 0;
}