二维数组5*5矩阵每行之和,每列之和,跟角线之和都相等,用C语言 应该怎么编? 每行数字是1-5各使用一次

C语言怎么弄呢

#include <stdio.h>
#define N 5

int main()
{
int i,j,t;

int a[N],r[N];

for(i = 0;i < N;i++)
{
a[i] = i + 1;
r[i] = 2 * i;
}

for(i = 0;i < N;i++)
{
for(j = 0;j < N;j++)
printf("%3d",a[(j+r[i])%N]);
printf("\n");
}

return 0;
}
代码思路是每行循环输出,在r[i] = 2 * i; 中,与i相乘的数不但单是2,只要是与N互质的数,皆能使每一列数互不同(和当然就是1+2+3……),至于每行的数,也就是数组里的数了(1,2,3……)
对于特定的N,取适当的数与i相乘赋值给r[i],可使对角线上的数各不相同。
比如N = 5时r[i] = 2 * i或r[i] = 3 * i都可以。

当N为5,7,11……时,满足条件。
不要以为N为质数都可以,3就不行。
如今N = 5,刚好可以。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-08
#include <stdio.h>
#define N 15

int sumrow(int (*a)[5],int n)
{
int sum=0;
for(int i=0;i<5;i++)
sum+=*(*(a+i)+n);
return sum;
}
bool slash(int (*a)[5])
{
int sum1,sum2;
sum1=sum2=0;
for(int i=0;i<5;i++)
{
sum1+=*(*(a+i)+i);
sum2+=*(*(a+i)+4-i);
}
if(sum1==sum2&&sum1==N) //这一点注意一下
return true;
else
return false;
}
int p(int (*a)[5])
{
for(int i=0;i<5;i++)
if(sumrow(a,i)==N&&slash(a)); //这里的问题
else return 0;
for(i=0;i<5;i++,putchar('\n'))
for(int j=0;j<5;j++)
printf("%-2d",a[i][j]);
putchar('\n');
}

void swap(int*a,int*b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
int perm(int (*a)[5],int j,int *b,int k,int m)
{
if(j==5) //
{
p(a);
return 0;
}
if(k==m)
{
for(int i=0;i<=m;i++)
{
*(*(a+j)+i)=b[i];
}
perm(a,j+1,b,0,4);
}
else
{
for(int i1=k;i1<=m;i1++)
{
swap(&b[i1],&b[k]);
perm(a,j,b,k+1,m);
swap(&b[i1],&b[k]);
}
}
}

void main()
{
int b[5]={1,2,3,4,5};
int a[5][5]={0};
perm(a,0,b,0,4);
}
相似回答