川师OJ上的一个题
没看懂题意。去问了问出题人。出题人说,看懂样例就行。
啊啊啊啊啊 哈哈 就算是网络赛的原题一定也有很多小伙伴和我一样没看懂题意吧
我结合了一个博主的代码,加上自己的注释。
注意题意是 应该是2^k阶矩阵。(题面小错误)
AC代码
#include<iostream>
#include<cstring>
using namespace std;
const int N=(1<<11)+10;
bool re[N][N]; //用:1表示Y ; 0表示S
void tu(int u)
{
if(u==10) return;
// 1<<(u-1)用来表示2的次方的值
//1到2^(k-1)行里: 2^(k-1)+1列及其以后 直接重复 1到 2^(k-1) 列
for(int j=1; j<=1<<(u-1); j++)
for(int i=(1<<u-1)+1; i<=1<<u; i++)
re[j][i]=re[j][i-(1<<u-1)];
//2^(k-1)+1到2^k行: 直接重复1到2^(k-1)行
for(int j=(1<<u-1)+1;j<=1<<u;j++)
for(int i=1;i<=1<<u-1;i++)
re[j][i]=re[j-(1<<u-1)][i];
//2^(k-1)+1到2^k行里:2^(k-1)+1列到2^k列 取非操作(即:s/y变为y/s)
for(int j=(1<<u-1)+1;j<=1<<u;j++)
for(int i=(1<<u-1)+1;i<=1<<u;i++)
re[j][i]=!re[j-(1<<u-1)][i-(1<<u-1)];
tu(u+1);
}
int main(){
int t;
cin>>t;
re[2][2]=true;
//递归开始!!
tu(2);
while(t--){
int n;
cin>>n;
// int x = 1<<n;
// cout<<"x: "<<x<<endl;
for(int i=1;i<=1<<n;i++){
for(int j=1;j<=1<<n;j++){
if(re[i][j]) cout<<"Y";
else cout<<"S";
} cout<<endl;
}
}
return 0;
}