码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-08-14 13:07:28      阅读:652      评论:0      收藏:0      [点我收藏+]

标签:

  题意:大致就是要求画出这个有规律的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 }

 

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

标签:

原文地址:http://www.cnblogs.com/Inkblots/p/4729546.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!