POJ-2083-Fractal

来源:互联网 发布:英文软件界面翻译工具 编辑:程序博客网 时间:2024/05/21 06:49

这个题就是个模拟题,用递归做,不太难

算乘方的时候用快速幂还有就是记忆化,否则可能会超时~

代码:

#include<cstdio>#include<cstring>#include<cmath>#define MAX 5001bool 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;}