http://codeforces.com/contest/610/problem/C
给一个数k,要求构造2^k个向量,着2^k个向量两两正交,向量维数为2^k
思路:递归构造
如果k=0,假设是1,k=1
1 1
1 -1
也就是把前一个复制4分,右下角的为负值。
这样的合理性很容易看出,。。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int SIZE = (1<<9)+1;
char mat[10][SIZE][SIZE];
void init() {
mat[0][0][0] = '+';
mat[0][1][0] = '*';
for(int k=1;k<10;k++) {
int sz = (1<<(k-1));
for(int j=0;j<sz;j++) {
for(int i=0;i<sz;i++) {
mat[k][j][i] = mat[k-1][j][i];
}
}
//r u
for(int j=0;j<sz;j++) {
for(int i=sz;i<sz*2;i++) {
mat[k][j][i] = mat[k-1][j][i-sz];
}
}
//l d
for(int j=sz;j<sz*2;j++) {
for(int i=0;i<sz;i++) {
mat[k][j][i] = mat[k-1][j-sz][i];
}
}
//r d
for(int j=sz;j<sz*2;j++) {
for(int i=sz;i<sz*2;i++) {
mat[k][j][i] = (mat[k-1][j-sz][i-sz]=='*')?'+':'*';
}
}
//cout << "k=" << k << endl;
}
}
void print(int k) {
int sz = (1<<k);
for(int i=0;i<sz;i++) {
for(int j=0;j<sz;j++) {
putchar(mat[k][i][j]);
}
putchar('\n');
}
}
int main() {
init();
int k;
while(cin >> k) {
print(k);
}
return 0;
}