题目大意:
让你构造出一个2^k*2^k的一个矩阵(只包含1和-1),令每行构成一个向量,保证使得每一个向量的叉乘都是0,输出格式:+表示1,*表示-1.
思路:
1、当n==2的时候
ans:
++
+*
2、当n==3的时候,将4*4的格子分成四部分,分别是左上左下右上和右下四个部分。然后将n==2时候的矩阵当做左上部分,然后平移过去形成右上,平移下去形成左下。右下的部分是左上部分取反得到。然后n==4的时候同理,依次类推即可。
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
int a[1000][1000];
int main()
{
a[1][1]=1;
a[1][2]=1;
a[2][1]=1;
a[2][2]=0;
for(int z=2;z<=9;z++)
{
int m=(1<<(z-1));
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
{
a[i+m][j]=a[i][j];
a[i][j+m]=a[i][j];
a[i+m][j+m]=1-a[i][j];
}
}
}
int n;
while(~scanf("%d",&n))
{
for(int i=1;i<=(1<<n);i++)
{
for(int j=1;j<=(1<<n);j++)
{
if(a[i][j]==1)
{
printf("+");
}
else printf("*");
}
printf("\n");
}
}
}