注册 登录
编程论坛 C++教室

(ー`′ー)好难的一个递归数组结合的图形打印题!!大神帮帮我吧!! T^T …

笙歌歌… 发布于 2014-12-01 08:05, 463 次点击
输入1:*
输入2:
 *
* *
输入3:
   *
  * *
 *   *
* * * *
输入4:
       *
      * *
     *   *
    * * * *
   *       *
  * *     * *
 *   *   *   *
* * * * * * * *
输入5:
               *
              * *
             *   *
            * * * *
           *       *
          * *     * *
         *   *   *   *
        * * * * * * * *
       *               *
      * *             * *
     *   *           *   *
    * * * *         * * * *
   *       *       *       *
  * *     * *     * *     * *
 *   *   *   *   *   *   *   *
* * * * * * * * * * * * * * * *
3 回复
#2
笙歌歌…2014-12-01 08:08
发表⊙﹏⊙的有毛病………是正三角形的…没弯
输入4:
       *
      * *
     *   *
    * * * *
   *       *
  * *     * *
 *   *   *   *
* * * * * * * *
#3
stop12042014-12-04 19:39
找出规律. 想算法.
要输出的字符数量 = 3^(N-1)

[ 本帖最后由 stop1204 于 2014-12-5 03:21 编辑 ]
#4
rjsp2014-12-05 15:56
程序代码:
#include <stdio.h>
#include <string.h>

int main( void )
{
    unsigned n = 6;

    // 构建梯形矩阵
    const unsigned m = 1u<<(n-1);
    const unsigned size = m*(3*m+1)/2;
    char* p = new char[size];
    memset( p, ' ', size );
    for( unsigned i=1; i!=m; ++i )
        p[m*i+i*(i+1)/2-1] = '\n';
    p[size-1] = '\0';
    p[m-1] = '*';

    // 向左下和右下处增殖
    for( unsigned i=0; i!=n-1; ++i )
    {
        unsigned sz = 1u<<i;
        for( unsigned r=0; r!=sz; ++r )
        {
            for( unsigned c=m-r-1; c!=m+r; ++c )
            {
                p[(r+sz)*m+(r+sz)*(r+sz+1)/2+c-sz] = p[r*m+r*(r+1)/2+c];
                p[(r+sz)*m+(r+sz)*(r+sz+1)/2+c+sz] = p[r*m+r*(r+1)/2+c];
            }
        }
    }

    // 输出
    puts( p );
    delete[] p;

    return 0;
}
1