**C语言-PTA习题-实现右上方**
输入格式:
n阶幻方是由前n×n个自然数组成的一个n阶方阵,其各行、各列及两条对角线所含的n个数的和相等。 现在请你用以下方法来构造名为“右上方”的n阶奇数幻方: 1:将1放在第一行中间一列; 2:从2开始直到n×n,各数依次按下列规则存放: ①每一个数存放在前一个数的右上方; ②如果行列范围超出矩阵范围,则回绕,例如1在第1行,则2应放在最后一行,列数同样加1; ③如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。 如果还是不太明白可参考样例。
输出格式:
对于每组数据,输出n阶幻方,每个数占4格,右对齐2 3 5
输入样例:
在这里给出一组输入。例如:
2
3
5
输出样例:
8 1 6
3 5 7
4 9 2
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
楼主尝试了很多方法,但是习题集都是判定的错的。
最后发现那个坑比的2原来是表示的可以输入组数(鸡肋),但是题目根本没有说…
以下是楼主的代码
代码:
#include<stdio.h>
int main()
{
int n;
int NMSL;
scanf("%d",&NMSL);
while (NMSL--){
scanf("%d",&n);
if(n%2==0)
;
else if(n%2!=0){
int arr[n][n];
int i, j, k,I,J;
I = 0;
J = n / 2;
for (i = 0;i < n;i++)
for (j = 0;j < n;j++)
arr[i][j] = 0;
for (k = 1;k <=n*n;k++)
{
arr[I][J] = k;
if((I-1)<0&&(J+1)<=(n-1))
{
I=n-1;
J=J+1;
}
else if(((J+1)>(n-1))&&((I-1)>=0))
{
I=I-1;
J=0;
}
else if((arr[I-1][J+1]!=0)||((I==0)&&(J==(n-1))))
{
I=I+1;
}
else
{ I=I-1;
J=J+1;
}
}
for (i = 0;i < n;i++)
{
for (j = 0;j < n;j++)
{
printf("%4d", arr[i][j]);
}
printf("\n");
}
}
}
return 0;
}
真坑啊,因为测试点只有一个,又不告诉我错在哪里。