J.Poker Face
递归求解
#include <bits/stdc++.h>
using namespace std;
#define maxn 1024
char ch1[maxn+1][maxn+1];
char ch2[maxn/2+1][maxn/2+1];
void init()
{
memset(ch1,' ',sizeof(ch1));
memset(ch2,' ',sizeof(ch2));
strcpy(ch2[0],"********");
strcpy(ch2[1],"*** ***");
strcpy(ch2[2],"*** ***");
strcpy(ch2[3],"*** ***");
strcpy(ch2[4],"* **** *");
strcpy(ch2[5],"* * * *");
strcpy(ch2[6],"* * * *");
strcpy(ch2[7],"********");
}
int mad(int as)
{
int vv=8;
for (int i=1;i<=8;i++){
if (vv==as) {
return i;
break;
}
vv=vv*2;
}
}
void print2(int x,int y,int n)
{
for (int s=y;s<y+n;s++){
ch1[x][s]='*';
ch1[x+n][s]='*';
}
for (int i=x+1;i<=(x+n-1);i++){
ch1[i][y]=ch1[i][y+n-1]='*';
}
}
void change(int n)
{
for (int i=0;i<n/2;i++){
swap(ch2[i],ch2[n-i-1]);
}
}
void print3(int n)
{
for (int i=0;i<n;i++){
ch1[0][i]=ch1[n-1][i]='*';
ch1[i][0]=ch1[i][n-1]='*';
}
}
int pp(int n)
{
if (n==0) return 1;
int data=1;
for (int i=0;i<n;i++){
data=data*2;
}
return data;
}
void print1(int n)
{
if (n<=8){
return;
}
print1(n/2);
change(n/2);
for (int i=n/2;i<n;i++){
for (int s=0;s<n/2;s++){
ch1[i][s+n/4]=ch2[i-n/2][s];
}
}
int data=mad(n);
print2(pp(data-1),pp(data-1),2*pp(data-1));
print2(pp(data-1),5*pp(data-1),2*pp(data-1));
print3(n);
if (n<1024)
for (int i=0;i<n;i++){
for (int s=0;s<n;s++){
ch2[i][s]=ch1[i][s];
ch1[i][s]=' ';
}
}
}
int main()
{
int n;
while(~scanf("%d",&n)&&n>=8){
init();
print1(n);
int num=0;
for (int i=0;i<n;i++){
for (int s=0;s<n;s++){
if (n<1024) printf("%c",ch2[i][s]);
else printf("%c",ch1[i][s]);
}
putchar('\n');
}
putchar('\n');
}
return 0;
}