int g[105][105]; void paint(int n){ for(int i=1;i<=n;i++){ g[1][i]=i; } for(int i=2;i<=n;i++){ for(int j=n;j>1;j--){ g[i][j]=g[i-1][j-1]; } g[i][1]=g[i-1][n]; } }
void paint(int n){ for(int i=1;i<=n-1;i++){ cout<<"matrix: "<<i<<endl; for(int j=1;j<=n;j++) cout<<j<<" "; cout<<endl; int last=n; for(int ii=2;ii<=n;ii++){ int first=last+i+1; while(first>n) first-=n; // 避免n变成0 for(int j=first;j<=n;j++) cout<<j<<" "; for(int j=1;j<first;j++) cout<<j<<" "; cout<<endl; last=first-1; } } }
(我表示这种构造方法我看的似懂非懂~)
#include <iostream> #include <cstdio> using namespace std; int H[2][2]={ 1,1, 1,-1 }; int dfs(int x,int y){ if(x<2 && y<2) return H[x][y]; int i=0,j=0; if(x>=2){ i=1; while(i*2<=x) i=i<<1; x-=i; } if(y>=2){ j=1; while(j*2<=y) j=j<<1; y-=j; } if(i==j) return -dfs(x,y); // 4 else if(i>j) return dfs(x,y+j); // 3 else return dfs(x+i,y); // 2 } int g[105][105],g2[105][105],g3[105][105]; int main() // g为hadamard矩阵 g2为其转置 g3为相乘后的结果 { int n; while(cin>>n){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ g[i][j]=dfs(i,j); } } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ g2[j][i]=g[i][j]; } } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ g3[i][j]=0; for(int k=0;k<n;k++){ g3[i][j]+=g[i][k]*g2[k][j]; } cout<<g3[i][j]<<" "; } cout<<endl; } } return 0; }