C语言:数字1-9排成3行3列,要求横着加,竖着加,对角线加,都等于15

要求输出形式是正确答案的矩阵形式,即:
8 1 6
3 5 7
4 9 2

#include "stdlib.h"
#include "stdio.h"
#define n 9 //定义魔术方块的行(列)数
void square(int M[n][n]);//声明求魔术方块的函数
void main(void)
{
int i,j;
int x[n];
int M[n][n];
for(i=0;i<n;i++)
x[i]=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
M[i][j]=0;
square(M);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%-3d",M[i][j]);
printf("\n");
}
printf("各行的数加和:");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
x[i]+=M[i][j];
printf("%d ",x[i]);
}
printf("\n\n");
for(i=0;i<n;i++)
x[i]=0;
printf("各列的数加和:");
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
x[j]+=M[i][j];
printf("%d ",x[j]);
}
printf("\n");
system("pause");
}
void square(int M[n][n])
{
int p,q,k;
p=0;
q=(n-1)/2;
M[0][q]=1;
for(k=2;k<=n*n;k++)
{
p=(p-1+n)%n;
q=(q-1+n)%n;
if(M[p][q]>0)
{
p=(p+2)%n;
q=(q+1)%n;
M[p][q]=k;
}
else M[p][q]=k;
}
}
自己在一本书上看到的算法,然后自己编的,n可以随便改成你需要的行数,比如你所说的3行3列
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-10
#include<stdio.h>
#include<conio.h>
void f1(int *p)
{
*(p+8)=10-*p;
*(p+6)=10-*(p+2);
*(p+1)=15-*p-*(p+2);
*(p+3)=15-*p-*(p+6);
*(p+5)=15-*(p+2)-*(p+8);
*(p+7)=15-*(p+6)-*(p+8);
}
int f2(int x,int y,int z,int n)
{int i,f=1,b[4];
b[0]=x,b[1]=y,b[2]=z,b[3]=n;

for(i=0;i<4;i++)

{if(b[i]<1||b[i]>9)
{f=0;break;}
}
return f;
}
int f3(int *q)
{int *m,*n,k=1;
for(m=q;m<=q+8;m+=2)
{ for(n=q+1;n<=q+7;n+=2)
if(*n==*m)
{k=0;
break;
}
}
return k;

}

main( )
{int a[4]={1,2,3,4},b[4]={6,7,8,9},c[9]={0},i,j;
clrscr();

c[4]=5;

for(i=0;i<4;i++)
{c[0]=a[i];

for(j=0;j<4;j++)
{c[2]=b[j];
f1(c);

if(c[1]+c[7]==10&&c[3]+c[5]==10)
if( f2(c[1],c[3],c[5],c[7]))
if(f3(c))
{printf("%4d%4d%4d\n",c[0],c[1],c[2]);
printf("%4d%4d%4d\n",c[3],c[4],c[5]);
printf("%4d%4d%4d\n",c[6],c[7],c[8]);
printf("\n");
}
}
}
}
我是在网上的搜的,希望对你有帮助!

参考资料:http://zhidao.baidu.com/question/154287850.html

本回答被提问者采纳
第2个回答  2011-03-10
等会哦
相似回答