当前位置: 代码迷 >> C语言 >> [求助]谭浩强习题------魔方阵
  详细解决方案

[求助]谭浩强习题------魔方阵

热度:484   发布时间:2005-07-31 10:40:00.0
[求助]谭浩强习题------魔方阵

所谓魔方阵是指它的每一行,每一列和对角线之和均相等. 三阶魔方阵为: 8 1 6 3 5 7 4 9 2 下面就是我编写的三阶魔方阵的程序,但是没有运行结果,请高手帮助,看看我的程序什么地方有错 main() { int i,j,k,sum1,sum2,sum3,sum4; int a[3][3];

sum1=0;sum2=0;sum3=0;sum4=0;k=0;

for(i=0;i<3;i++) for(j=0;j<3;j++) { if(i==j)sum1=sum1+a[i][j]; sum1和sum2表示对角线之和 if(i==2-j)sum2=sum2+a[i][j]; } if(sum1==sum2) { for(i=0;i<3;i++) { for(j=0;j<3;j++) { sum3=sum3+a[i][j]; sum3表示一行之和 sum4=sum4+a[j][i]; sum4表示一列之和 } if(sum3==sum4&&sum3==sum2) {sum3=0;sum4=0;k++;} } }

if(k==3) k=3表示3行3列都相等 {for(i=0;i<3;i++) for(j=0;j<3;j++) { printf("%2d",a[i][j]); printf("\n");} } }

搜索更多相关的解决方案: 谭浩强  魔方  习题  int  

----------------解决方案--------------------------------------------------------

一. de la loubere 构造奇数阶幻方算法 1.首先将1置于第一行中间的位置上. 2.若i已添入适当的位置,则对i+1执行如下特殊条款: (1) 若i在第一行,则将i+1填入i右边一行的最底行位置; (2) 若i在最后一列,则将i+1填入i的上一行的第一列; (3) 若i在第一行最后一列或i+1该填的位置已被填入值,则将i+1填入i所在位 置的下方. 3.若i不在2中特殊条款之列,则将i+1填入i紧右边一列的上一行.

二.本算法由c语言实现,在屏幕允许的条件下,可求出小于40阶的奇数阶幻方.

三.对程序有何疑问,或发现不足之处欢迎发送邮件至Email:zzyjsjcom@126.com 附 源代码: #include<stdio.h> #include<stdlib.h> void main() { int i,j,k,n; int a[40][40]={{0}}; clrscr(); printf("\t\t\tPress Enter key to continue..."); getchar(); printf("\n\n\n\t\t\tPlease input an odd number n,n="); scanf("%d",&n); a[0][n/2]=1; for(i=1;i<=n*n;i++) for(j=0;j<n;j++) for(k=0;k<n;k++) if(a[j][k]==i) if(j==0&&a[n-1][k+1]==0&&(k+1)<n) a[n-1][k+1]=i+1; else if(k==n-1&&a[j-1][0]==0) a[j-1][0]=i+1; else if(j==0&&k==n-1||j==0&&a[n-1][k+1]!=0||k==n-1&&a[j-1][0]!=0||a[j-1][k+1]!=0) a[j+1][k]=i+1; else a[j-1][k+1]=i+1; printf("\n\t\tThe resurts are:\n\n\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%4d",a[i][j]); printf("\n"); } printf("\n\n-------------------------------------------------------------------------------\n"); printf("---------------------------Press any key to return-----------------------------\n"); printf("-------------------------------------------------------------------------------\n"); getch(); }


----------------解决方案--------------------------------------------------------
题本身好像就有点问题!
数组中的每个元素的初值怎么取?有没有取值范围的限制?
象你那样定义的数组,元素没有初值啊!
----------------解决方案--------------------------------------------------------
第二条语句,初值均附为:0
----------------解决方案--------------------------------------------------------
#include&lt;stdio.h&gt;
main()
{int i,j,k,a[11][11],x,count=0;
printf("请输入小于9的奇数:\n");
scanf("%d",&amp;x);
i=0;
j=x/2;
for(k=1;k&lt;=x*x;)
  {  
    a[i][j]=k++;
if((k-1)%x==0) i++;     //一般等于5 10 15 20 25
else if(i==0) {i=x-1;j++;} //最上面的时候
else if(j==x-1) {i--;j=0;} //在最左边的时候
else {i--;j++;}

}
   for(i=0;i&lt;x;i++)  //用来输出
  {
   for(j=0;j&lt;x;j++){
    printf("%d\t",a[i][j]);
    count++;
    if(count==x)
    {
   printf("\n");
   printf("\n");
      count=0;
    }
   }
  }
}
----------------解决方案--------------------------------------------------------

对于这个问题我编了一个vc++的程序,不过出现了问题。请高手指点: #define N 3 #define M N*N-1 #include <iostream.h>

class Array{ public: int a[M+1]; int i,k; Array( ){ for(i=0;i<=M;i++) a[i]=i+1; }

bool _ture(int a[]){ int num1=0,num2=0; bool t=true; int c[N][N],d[N][2]; for(i=0;i<N;i++) for(k=0;k<N;k++) c[i][k]=a[i*N+k]; for(i=0;i<N;i++) for(k=0;k<2;k++) d[i][k]=0; for(i=0;i<N;i++){ for(k=0;k<N;k++){ d[i][0]+=c[i][k]; d[i][1]+=c[k][i]; } num1+=c[i][i]; num2+=c[i][N-i-1]; } if(num1==num2){ for(i=0;i<N;i++){ if((num1==d[i][0])&&(num1==d[i][1])) t=true; else return false; } return t; } else return false; }

void _cha(int *x,int *y){ int t; t=*x; *x=*y; *y=t; }

void go(int *p1){ int *q,*w; //while(!(_ture(a))&&p1>=a){ while((a[0]<2)){ if(*p1>*(p1-1)){ q=a+M; while(q>=p1){ if(*q>*(p1-1)) _cha(q,p1-1); q--; } for(i=0;i<a+M-p1;i++){ w=p1; while(w<a+M){ if((*w)>*(w+1)) _cha(w,w+1); w++; } } go(&a[M]); } else go(p1-1); } } }; void main(){ int i,k; Array array; array.go(&array.a[M]);

cout<<"结果如下:" <<endl; for(i=0;i<N;i++){ cout<<"\n"; for(k=0;k<N;k++){ cout<<array.a[i*N+k]; } cout<<"\n"; } }


----------------解决方案--------------------------------------------------------
你这种方法并没有用到“方法”,只是一种匹配的办法,这样速度超级慢,
你去查查奥林匹克书,上边有写,奇数列和偶数列的无限排列
----------------解决方案--------------------------------------------------------
#include<stdio.h> main() {int i,j,k,a[11][11],x,count=0; printf("请输入小于9的奇数:\n"); scanf("%d",&x); i=0; j=x/2; for(k=1;k<=x*x;) { a[i][j]=k++; if((k-1)%x==0) i++; //一般等于5 10 15 20 25 else if(i==0) {i=x-1;j++;} //最上面的时候 else if(j==x-1) {i--;j=0;} //在最左边的时候 else {i--;j++;} } for(i=0;i<x;i++) //用来输出 { for(j=0;j<x;j++){ printf("%d\t",a[i][j]); count++; if(count==x) { printf("\n"); printf("\n"); count=0; } } } }

----------------解决方案--------------------------------------------------------

#include <stdio.h>

void main() { int i,j,k,n; int **p; printf("请输入一个大于等于3并且小于等于19的奇数!\n"); scanf("%d",&n); if(n%2==0) { printf("对不起!输入不正确请重新输入!\n"); } else { p=new int *[n]; for(i=0;i<n;i++) { p[i]=new int [n]; } for(i=0;i<n;i++) { for(j=0;j<n;j++) { *(*(p+j)+i)=0; } } i=0; j=n/2; for(k=1;k<=n*n;k++) { *(*(p+j)+i)=k; i--; j++; if((i<0)&&(j<n)) { i=n-1; } if((i>=0)&&(j>n-1)) { j=0; } if(((i<0)&&(j>n-1))||(*(*(p+j)+i)!=0)) { i+=2; j--; } } printf("您所需要的九宫图图案如下:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%3d ",*(*(p+j)+i)); } printf("\n"); } delete []p; } }


----------------解决方案--------------------------------------------------------
试试这个吧
----------------解决方案--------------------------------------------------------
  相关解决方案