求指点迷津 大意是: N*N的正方形中有1-N*N,任意变换使之横竖斜线上的和都相等. #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"; } }