分享

画金字塔

 血马雄风 2012-03-22
/************************************************************************/
/*题    目:画金字塔                                                                   
  题目阐述:输入一个数字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]);
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约