HDUOJ 6708 Windows Of CCPC(模拟)
solution:最开始是4个字符左下角那个和其余3个不一样,用最初的可以拼成第2个,把第2个分成4部分,左下角和第一个相反,也就是P变为C,C变为P,其余相同。
#include <bits/stdc++.h>
using namespace std;
char s[1025][1025];
void f(int k) {
if(s[(int)pow(2,k-1)][(int)pow(2,k-1)]==0) {
f(k-1);
}
for(int i=1;i<=(int)pow(2,k-1);i++) {
for(int j=(int)pow(2,k-1)+1;j<=(int)pow(2,k);j++) {
s[i][j]=s[i][j-(int)pow(2,k-1)];
}
}
for(int i=(int)pow(2,k-1)+1;i<=(int)pow(2,k);i++) {
for(int j=1;j<=(int)pow(2,k-1);j++) {
if(s[i-(int)pow(2,k-1)][j]=='P') {
s[i][j]='C';
}
else {
s[i][j]='P';
}
}
}
for(int i=(int)pow(2,k-1)+1;i<=(int)pow(2,k);i++) {
for(int j=(int)pow(2,k-1)+1;j<=(int)pow(2,k);j++) {
s[i][j]=s[i-(int)pow(2,k-1)][j-(int)pow(2,k-1)];
}
}
}
int main() {
int t;
cin>>t;
for(int i=0;i<=1025;i++) {
for(int j=0;j<=1025;j++) {
s[i][j]=0;
}
}
s[1][1]='C';
s[1][2]='C';
s[2][1]='P';
s[2][2]='C';
f(10);
while(t--) {
int k;
cin>>k;
for(int i=1;i<=(int)pow(2,k);i++) {
for(int j=1;j<=(int)pow(2,k);j++) {
cout<<s[i][j];
}
cout<<endl;
}
}
return 0;
}