AcWing 118 分形

#include<bits/stdc++.h>
//AcWing 118  分形
//by Mercury
//202209
using namespace std;
typedef long long ll;
const int maxn=3000;
char a[maxn][maxn];
int km(int a,int b)//快速幂
{
    int ans=1;
    while(b)
    {
        if(b&1) {
            ans=ans*a;
        }
        a=a*a;
        b>>=1;
    }
    return ans;
    //需要开long long吗
}
void se(int x1,int x2,int y1,int y2,int k)//递归分形
{
    if(k==1) {//一级分形回溯
        a[x1][y1]='X';
        return;
    }
    //向下一层递推
    int q=(x2-x1+1)/3;int w=(y2-y1+1)/3;//x,y的三等分距离
    //x2-x1+1左端点和右端点的距离   /3分为三份  *2为距离左端点两份距离  
    //错误位置及提醒  没加x1和y1  y1?竟然没报错 重名函数需要注意
    se(x1,q+x1-1,y1,w+y1-1,k-1);//左上
    se(x1+q*2,x2,y1,y1+w-1,k-1);//右上
    se(x1+q*2,x2,y1+w*2,y2,k-1);//右下
    se(x1,x1+q-1,y1+w*2,y2,k-1);//左下
    se(x1+q,x1+q*2-1,y1+w,y1+w*2-1,k-1);//中间
    //二次修改 不知道是函数的问题还是输出的问题 整个图形右上部分全空 然而其他部分完好
    //似乎是右上函数的问题 每一级都少右上部分
    //看不出错误啊  右上的右和右下的一样  上和左上一样  难道是快速幂的问题
    //将右上注释掉后  左下的也全部消失了  写反了吗?
    //将左下的注释后答案竟然没有变  y的位置写错了
    //为什么是反的? 数组是怎么存的?  虽然对于这道题没有区别
}
int main()
{
    int n;
    scanf("%d",&n);
    while(n!=-1)//-1结束
    {
        memset(a,0,sizeof a);//多组数据清空
        int t=km(3,n-1);//右下边界 快速幂
        se(1,t,1,t,n);
        for(int i=1;i<=t;i++)//输出
        {
            for(int j=1;j<=t;j++)
            {
                if(a[i][j]=='X') printf("X");
                //if(a[i][j]) cout<<'X';  不知道这样写对不对  但是感觉有不确定因素
                else printf(" ");
            }
            printf("\n");
        }
        printf("-\n");//分隔符
        scanf("%d",&n);//输入下一组数据的n
    }
    return 0;
}
//简单题  但是将近一天  思路不清晰
//问题: 数组的实现

 

posted @ 2022-09-12 17:57  Mercury1004  阅读(6)  评论(0)    收藏  举报