Windows Of CCPC(递推)

Windows Of CCPC(递推)

思路:签到题,每个矩形分成四个小块,递推,除了左下角取反外,其他由 k − 1 k-1 k1的块得到。

#include
using namespace std;
typedef long long ll;
const int N=(1<<10)+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair
#define fi first
#define se second
#define pb push_back
#define il inline
char a[N][N],b[N][N];
int main(){
     
	int t;scanf("%d",&t);
	a[1][1]=a[1][2]=a[2][2]='C',a[2][1]='P';
	while(t--){
     
		int n;
		scanf("%d",&n);
		int k=2;
		for(int i=2;i<=n;i++,k<<=1){
     
			for(int j=1;j<=k;j++){
     
				for(int l=1;l<=k;l++){
     
					b[j][l]=a[j][l];
				}
			}
			for(int j=1;j<=k;j++){
     
				for(int l=1;l<=k;l++){
     
					b[j][l+k]=a[j][l];
				}
			}
			for(int j=1;j<=k;j++){
     
				for(int l=1;l<=k;l++){
     
					b[j+k][l]=(a[j][l]=='C')?'P':'C';
				}
			}
			for(int j=1;j<=k;j++){
     
				for(int l=1;l<=k;l++){
     
					b[j+k][l+k]=a[j][l];
				}
			}
			swap(a,b);
		}
		for(int i=1;i<=k;i++){
     
			for(int j=1;j<=k;j++) 
				printf("%c",a[i][j]); 
		puts("");
		}
	} 
	return 0;
}

你可能感兴趣的:(递推)