昨天没事干,本来切了2道水题,可以oj又挂了就没交上。今天交WA了一次,因为一个参数写错了= =简单总结一下。

题目大意:

抽象出如下序列:

1, 1、1,2,  1、1、1,1、2,3....

第i串序列要么其和比前面的长,要么字典序比前面的大。

序列和显然从1,2,3,……,n。

序列长度为i时,其个数有

f[i] = f[i-1] + f[i-2] + ... + f[1] + f[0] ;

最左边为1的为f[i-1]个,最左边为2的为f[i-2],i的为f[0]。。

f[0] = f[1] = 1 ;

so f[i] = 1 << ( i - 1 ) ;

 

对于给定的n,首先确定其长度,然后dfs下去即可,保存一个二维数组可以替换掉dfs,要codejam了...附代码如下。。

代码:

#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>

#include <string.h>

 

/************************************************************************/

/* soj1678                                                              */

/************************************************************************/

 

const int maxn = 33 ;

typedef unsigned sth ;

sth f[maxn] , n , ans[maxn] , cnt ;

 

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 ;

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 ;

for( i = 0 ; i < cnt ; i++)

{

for( j = 0 ; j < ans[i] ; j++)

putchar('/');

for( j = 0 ; j < ans[i] ; j++)

putchar('\\');

}

puts("");

}

 

int main()

{

init();

while (~scanf("%u",&n),n) solve();

}