小菜发一个N*N魔方的计算方法 请高手帮我解答一个问题
#include <stdio.h>
int isequal(int a[],int n) /*检验是否符合魔方的各个项相加相等*/
{
int nn[50][50];
int i;
int j;
int sum[100]={0};
int flag=1;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
nn[i][j]=a[3*i+j];
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
sum[i]=sum[i]+nn[i][j];
sum[i+n]=sum[i+n]+nn[j][i];
}
}
for(i=0;i<n;i++)
{
sum[2*n]=nn[i][i]+sum[2*n];
sum[2*n+1]=nn[i][n-i-1]+sum[2*n+1];
}
for(i=0;i<=2*n+1;i++)
{
if(sum[0]!=sum[i])
{
flag=0;
break;
}
}
return(flag);
}
int isdef(int a[],int n) /*查看a[]的数据有没有相同的,如果没有返回“1”,有则返回“0”*/
{
int i;
int j;
int flag=1;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]==a[j])
{
flag=0;
i=n;
j=n;
break;
}
}
}
return(flag);
}
main()
{
int b;
int i;
int j;
int a[160]={0};
int n;
printf("\nIn put a number\n"); /*输入模方N*N 的那个N值*/
scanf("%d",&n);
for(i=0;i<n*n;i++)
{
a[i]=i+1;
}
for(;;) //让魔方中的数据,像数数那样变动
{
a[n*n-1]++;
for(j=n*n-1;j>0;j=j-1)
{
if(a[j]==n*n+1)
{
a[j]=1;
a[j-1]++;
if(a[0]==n*n+1) //当a[0]==n*n+1时,那么魔方的所有组成都被验证过了
{
printf("\nend");
scanf("%d",&b); //问题1
}
if(a[j-1]!=n*n+1)
break;
}
}
/* printf("\n%5d%5d%5d%5d%5d%5d%5d%5d%5d",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);*/
if(isdef(a,n*n)&&isequal(a,n)) //调用判断函数
{
for(j=0;j<n;j++)
{
printf("\n");
for(i=0;i<n;i++)
{
printf("%5d",a[n*j+i]);
}
}
printf("\n");
scanf("%d",&b);
}
}
}
问题1那个位置要是换成“getchar()” 那么在结束是会输出两个“end” 这是为什么啊
高手们能不能帮我再改下,运行这个程序n=3出第一个输出就要15秒。n=4我实在等不下去了,反正10分钟出不来一个。还有我运行的时候cpu都是100%
[解决办法]
右一上一受阻下一
[解决办法]
在最后没有\n的printf后面加fflush(stdout);
[解决办法]
单步调试和设断点调试是程序员必须掌握的技能之一。
[解决办法]
这个题还有一种简单方法。
1
24
357 ==>
68
9
294
753
618
即开始用斜填法,然后将凸出的部分数字(上下左右)填入到对面空格中。此处即9填到2,4间,1填到6,8间,7填到2,6间,3填到4,8间。其它阶的,如法炮制。很简单吧!
[解决办法]
上面的图本来是对的,发上去就变形了。你自己看哈文字描述画一下就懂了。