/************************************************************************/ /*题 目:画金字塔 题目阐述:输入一个数字n(1<=n<=10),输出一个对应大小(注意观察下面的样例)的金字塔。 样例1 输入:1 输出:/\ /__\ 样例2 输入:2 输出:/\ /__\ /\ /\ /__\/__\ 样例3 输入:3 输出:/\ /__\ /\ /\ /__\/__\ /\ /\ /__\ /__\ /\ /\ /\ /\ /__\/__\/__\/__\ 时 间:2012—4—5 编 写 员:杨钧淇 主要思想:递归 分治 主要函数: */ /************************************************************************/ //方法1 #include <stdio.h> #include <math.h> #include <string.h> #define N 1024 int array[N][N]; int findnumber(int n) { int number = 1; for(int i=1; i<=n; i++) number *= 2; printf("%d\n", number); return number; } void print(int n) { char c= 92; for(int i=0; i<n; i++) { for(int j=0; j<2*n; j++) { if(array[i][j] == 0) printf(" "); else if(array[i][j] == 1) printf("/"); else if(array[i][j] == 2) printf("_"); else printf("%c", c); } printf("\n"); } printf("\n"); } //正三角形 void fillzheng(int number, int x, int y) { printf("(%2d ,%2d)\n", x, y); int i; //左边 for( i=1; i<=number; i++) { array[x][y] = 1; x++; y--; } print(number); //横边 x--; y += 2; int flag = 1; int s = 2*number-2; for(i=1; i<=s; i++) { if(flag==3 || flag==4) { y++; //printf("flag=%d\n", flag); if(flag%4 == 0) flag = 1; if(flag == 3) flag++; //print(number); continue; } array[x][y] = 2; y++; flag++; //print(number); } //print(number); //右边 for(i=1; i<=number; i++) { array[x][y] = 3; x--; y--; } print(number); x++; printf("(%2d ,%2d)\n", x, y); } //倒等边三角形 void fillArray(int number, int x, int y) { int i; if(number == 1) return; //左边 printf("(%2d ,%2d)\n", x, y); printf("%d\n", number); for(i=1; i<=number; i++) { array[x][y] = 3; x--; y--; } //print(number); //横边 y += 2; int flag = 1; int s = 2*number-2; for(i=1; i<=s; i++) { if(flag==3 || flag==4) { y++; if(flag%4 == 0) flag = 1; if(flag == 3) flag++; continue; } array[x][y] = 2; y++; flag++; } //print(number); //右边 x++; //y--; for(i=1; i<=number; i++) { array[x][y] = 1; x++; y--; } x--; //print(number); printf("%d\n", x); fillArray(number/2, x-number, y); fillArray(number/2, x, y-number); fillArray(number/2, x, y+number); } void main() { int n; memset(array, 0, sizeof(array)); while(1) { scanf("%d", &n); if(n<1 || n>10) printf("你输入的数字不正确,请重新输入:"); else break; } int number = findnumber(n); int x = 0; int y = number-1; fillzheng(number, x, y); fillArray(number/2, x+number-1, y); print(number); getchar(); } //方法2 #include <stdio.h> #include <math.h> char ans[100][200];//ans[pow(2,N)-1][pow(2,N+1)-1] 记录结果 void Dfs(int n,int x,int y)//n表示子金字塔的大小,(x,y)表示塔顶位置 { if(n==1)//塔的大小最小 { ans[x][y]=47; ans[x+1][y-1]=47; ans[x][y+1]=92; ans[x+1][y+2]=92; ans[x+1][y]=95; ans[x+1][y+1]=95; } else//将塔分成三个子塔 { Dfs(n-1,x,y); Dfs(n-1,x+pow(2,n-1),y-pow(2,n-1)); Dfs(n-1,x+pow(2,n-1),y+pow(2,n-1)); } } void main() { int N; scanf("%d",&N); for(int i=0;i<=pow(2,N)-1;i++) for(int j=0;j<=pow(2,N+1);j++) ans[i][j]=' '; Dfs(N,0,pow(2,N)-1); for(int k=0;k<=pow(2,N)-1;k++) printf("%s\n",ans[k]); } |
|