这个题就是个模拟题,用递归做,不太难
算乘方的时候用快速幂还有就是记忆化,否则可能会超时~
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#define MAX 5001
bool map[MAX][MAX];
int QuickPow(int a,int n)
{
int ans=1;
while(n)
{
if(n&1)
ans*=a;
a*=a;
n>>=1;
}
return ans;
}
void Print(int n,int x,int y)
{
if(map[x][y])
return;
if(n==1)
{
map[x][y]=1;
return;
}
int m=QuickPow(3,n-2);
Print(n-1,x,y);
Print(n-1,x,y+2*m);
Print(n-1,x+m,y+m);
Print(n-1,x+2*m,y);
Print(n-1,x+2*m,y+2*m);
}
int main()
{
int n;
while(scanf("%d",&n)&&n!=-1)
{
memset(map,0,sizeof(map));
Print(n,0,0);
int m=QuickPow(3,n-1);
for(int i=0;i<m;i++)
{
int ita;
for(int j=m-1;j>=0;j--)
if(map[i][j])
{
ita=j;
break;
}
for(int j=0;j<=ita;j++)
{
if(map[i][j])
printf("X");
else
printf(" ");
}
printf("\n");
}
printf("-\n");
}
return 0;
}