ACM/ICPC 之 分治法入门(画图模拟:POJ 2083)

  题意:大致就是要求画出这个有规律的Fractal图形了= =

  例如 1 对应 X

     2 对应 X  X

          X

          X  X

  • 这个题是个理解分治法很典型的例子(详情请参见Code)
  • 分治法:不断缩小规模,以致把整个大问题分解为若干个可以直接处理的小问题,一般通过递归调用实现,可以用极简代码完成高复杂的工作,但空间与时间占用也相对较大。

  

 1 //分治法画图
 2 //Memory:880K  Time:16 Ms
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 using namespace std;
 7 
 8 #define MAX 1000
 9 
10 //╮(╯▽╰)╭,毕竟图形处理是硬伤,只能用数组模拟画布了= =
11 char fig[MAX][MAX];        //figure
12 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     else
19     {
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 }

 

    原文作者:Inkblots
    原文地址: https://www.cnblogs.com/Inkblots/p/4729546.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞