直接想会非常棘手
考虑从2n−1维空间递推到2n维空间
把2n−1维空间构造得向量看成一个矩阵
那么2n维空间的合法构造就是左上,右上,左下都放2n−1维的矩阵
右下放2n−1维的矩阵的相反数
由于取相反数前向量乘积是0,那么取相反数后不改变
且保证了这2n个向量两两不相等且合法
#include <bits/stdc++.h>
using namespace std;
const int maxn=509;
int k,a[maxn][maxn];
void dfs(int n,int x,int y,int v)
{
if( n==1 ) a[x][y]=v;
else
{
dfs(n/2,x,y,v);
dfs(n/2,x+n/2,y,v);
dfs(n/2,x,y+n/2,v);
dfs(n/2,x+n/2,y+n/2,-v);
}
}
int main()
{
cin >> k;
dfs(1<<k,1,1,1);
for(int i=1;i<=(1<<k);i++)
for(int j=1;j<=(1<<k);j++)
{
if( a[i][j]==1 ) cout << '+';
else cout << '*';
if( j==(1<<k) ) cout << endl;
}
}