/************************************************************************/
/*题 目:画金字塔
题目阐述:输入一个数字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]);
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。