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();
}