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; } //简单题 但是将近一天 思路不清晰 //问题: 数组的实现