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 }
他坐在湖边,望向天空,她坐在对岸,盯着湖面