HDUOJ 6708 Windows Of CCPC(模拟)

HDUOJ 6708 Windows Of CCPC(模拟)_第1张图片
solution:最开始是4个字符左下角那个和其余3个不一样,用最初的可以拼成第2个,把第2个分成4部分,左下角和第一个相反,也就是P变为C,C变为P,其余相同。

#include 

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<

你可能感兴趣的:(模拟,CCPC,2019网络赛)