JZYZOJ1237 教授的测试 dfs

http://172.20.6.3/Problem_Show.asp?id=1237

 
锻炼搜索的代码能力,不错的题。
开始对dfs到底向下传递什么搞不清楚,需要想一下,noip难度的题还有这种情况,果然还是太蒻。
代码
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<queue>
 7 #include<vector>
 8 using namespace std;
 9 int n;
10 int f[30]={};
11 int mm[30][2]={},tot;
12 void init(int x,int siz,int xu){
13     if(siz==0||siz==1)return;
14     int w=xu,z;
15     for(int i=0;i<siz;i++){
16         if(w>f[i]*f[siz-1-i])w-=f[i]*f[siz-1-i];
17         else{z=i;break;}
18     }
19     int zz2=w%f[siz-1-z];
20     int zz1=w/f[siz-1-z]+1;
21     if(zz2==0){zz2=f[siz-1-z];zz1-=1;}
22     if(z!=0){mm[x][0]=++tot;init(tot,z,zz1);}
23     if(siz-1-z!=0){mm[x][1]=++tot;init(tot,siz-1-z,zz2);}
24 }
25 void put(int x){
26     if(mm[x][0]){printf("(");put(mm[x][0]);printf(")");}
27     printf("X");
28     if(mm[x][1]){printf("(");put(mm[x][1]);printf(")");}
29 }
30 int main(){
31     int ma=100000000;
32     f[1]=1;f[0]=1;
33     for(int i=2;f[i-1]<ma;i++){
34         for(int j=0;j<=(i-1)/2;j++){
35             f[i]+=f[j]*f[i-1-j]*2;
36             if(j==i-1-j){
37                 f[i]-=f[j]*f[i-1-j];
38             }
39         }
40     }
41     while(~scanf("%d",&n)){
42         if(n==0)break;
43         memset(mm,0,sizeof(mm));
44         tot=1;int siz;
45         int q=0;
46         for(int i=1;;i++){
47             q+=f[i];
48             if(n<=q){siz=i;q-=f[i];break;}
49         }
50         init(1,siz,n-q);
51         put(1);
52         cout<<endl;
53     }
54     return 0;
55 }
View Code
原文地址:https://www.cnblogs.com/137shoebills/p/7786981.html