题意:大致就是要求画出这个有规律的Fractal图形了= =
例如 1 对应 X
2 对应 X X
X
X X
- 这个题是个理解分治法很典型的例子(详情请参见Code)
- 分治法:不断缩小规模,以致把整个大问题分解为若干个可以直接处理的小问题,一般通过递归调用实现,可以用极简代码完成高复杂的工作,但空间与时间占用也相对较大。
1 //分治法画图 2 //Memory:880K Time:16 Ms 3 #include4 #include 5 #include 6 using namespace std; 7 8 #define MAX 1000 9 10 //╮(╯▽╰)╭,毕竟图形处理是硬伤,只能用数组模拟画布了= =11 char fig[MAX][MAX]; //figure12 int scale;13 14 void dfs(int n,int size,int x,int y)15 {16 if(n==1)17 fig[x][y] = 'X';18 else19 {20 //规模缩小一倍21 size /= 3;22 23 /*分治画五个分区域*/24 dfs(n-1,size,x,y);25 dfs(n-1,size,x+size*2,y);26 dfs(n-1,size,x,y+size*2);27 dfs(n-1,size,x+size,y+size);28 dfs(n-1,size,x+size*2,y+size*2);29 }30 }31 32 int main()33 {34 int n,i,j;35 while(~scanf("%d",&n), n != -1)36 {37 //计算当前规模所产生的尺寸38 scale = 1;39 for(i=2;i<=n;i++)40 scale *= 3;41 //初始化画布42 for(i=1;i<=scale;i++)43 {44 for(j=1;j <= scale;j++)45 fig[i][j] = ' ';46 fig[i][j] = '\0';47 }48 49 dfs(n,scale,1,1);50 for(i=1;i<=scale;i++)51 printf("%s\n",&fig[i][1]);52 printf("-\n");53 }54 55 return 0;56 }