本题我的基本思路是先固定第一行和第一列,从2,2,开始更新。只要保证本列和本行纹出现过就行,而且还要从小到大访问
#include<stdio.h> #include<math.h> int a[600][600]; int main() { int k,n,max; int i,j,x,xx,y,yy,flat,f; while(scanf("%d",&n)!=EOF) { max=(int)pow(2,n); x=2; y=2; for(i=1;i<=max;++i) { a[1][i]=i; a[i][1]=i; // a[i][i]=1; } for(i=2;i<=max;++i) { for(j=2;j<=max;++j) { for(f=1;f<=max;++f) { flat=1; for(xx=1;xx<i;++xx) { if(a[xx][j]==f) { flat=0; break; } } if(flat==1) { for(yy=1;yy<j;++yy) { if(a[i][yy]==f) { flat=0; break; } } } if(flat==1) { a[i][j]=f; break; } }////fff } x=i; }////fff for(i=1;i<=max;++i) { for(j=1;j<=max;++j) printf("%d ",a[i][j]); printf("\n"); } }//while return 0; }