首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

小菜发一个N*N魔方的计算方法 请高手帮小弟我解答一个有关问题

2012-04-14 
小菜发一个N*N魔方的计算方法请高手帮我解答一个问题#include stdio.hint isequal(int a[],int n)/*检验

小菜发一个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间。其它阶的,如法炮制。很简单吧!

[解决办法]
上面的图本来是对的,发上去就变形了。你自己看哈文字描述画一下就懂了。

热点排行
Bad Request.