JZYZOJ1237 教授的测试 dfs
Posted 鲸头鹳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于JZYZOJ1237 教授的测试 dfs的主要内容,如果未能解决你的问题,请参考以下文章