soj2714

soj1678的字符界面版本。

通過計算空格從底向上推即可。

源碼:

 #include <stdio.h>

#include <stdlib.h>
#include <ctype.h>
#include <string.h>

/************************************************************************/
/* soj2714                                                              */
/************************************************************************/

const int maxn = 33 ;
typedef unsigned sth ;
sth f[maxn] , n , ans[maxn] , cnt ;
char res[maxn][128] ;

void init()
{
    int i ;
    for( i = 2 , f[0] = f[1] = 1 ; i < maxn ; i++) f[i] = f[i-1] * 2 ;
}

void dfs(int len)
{
    sth i , j = 1 ;
    for( i = len-1 , j = 1 ; i >= 1 ; i--,j++) 
    {
        if( n <= f[i] ) break;
        if( n > f[i] ) n -= f[i] ;
    }
    if( n == f[i] ) {    ans[cnt++] = j ; ans[cnt++] = i ;    }
    else {    ans[cnt++] = j ; dfs(len-j);    }
}

inline void solve()
{
    sth i , j , k , size , mx , w ;
    cnt = 0 ;
    for ( i = 1 ; i < maxn ; i++)
    {
        if( n > f[i] ) n -= f[i] ;
        else if( n <= f[i] ) break ;
    }
    if( n < f[i] ) dfs(i);
    else ans[cnt++] = i ;
    //i is the size
    size = i ;
    for( i = 1 , mx = ans[0] ; i < cnt ; i++) if( mx < ans[i] ) mx = ans[i] ;
    for( i = 1 ; i <= mx ; i++)
    {
        for( j = k = 0 ; j < cnt ; j++) 
        {
            if( ans[j] >= i )
            {
                for( w = 1 ; w < i ; w++,k++) res[i][k] = ' ';
                res[i][k++] = '/' ;
                for( w = 0 ; w < 2 * (ans[j] - i ) ; w++,k++) res[i][k] = ' ';
                res[i][k++] = '\\' ;
                for( w = 1 ; w < i ; w++,k++) res[i][k] = ' ';
            }
            else
                for( w = 0 ; w < 2 * ans[j] ; w++,k++) res[i][k] = ' ';
        }
    }
    for( i = mx ; i >= 1 ; i--)
    {
        for( j = 0 ; j < 2*size ; j++)
            printf("%c",res[i][j]);
        puts("");
    }
puts("");
}

int main()
{
    init();
    while (~scanf("%u",&n),n) solve();
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章