bzoj1081: [SCOI2005]超级格雷码(dfs)

1081: [SCOI2005]超级格雷码

题目:传送门 

 


 

 

题解:

   又是一道水题...

   因为之前做过所以知道规律:

   如n=2 B=3:

   00 10 20    21 11 01    02 12 22

   不难看出,偶数结尾的从前面从小到大,奇数的话就是大到小

    


 

 

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 int n,B;
 8 int a[1100];
 9 void dfs(int k,int T)
10 {
11     if(k==n+1)
12     {
13         for(int i=n;i>=1;--i)
14         {
15             if(a[i]<10)printf("%d",a[i]);
16             else printf("%c",a[i]-10+'A');
17         }
18         printf("\n");return ;
19     }
20     if(T==1)
21     {
22         for(int i=B-1;i>=0;--i)
23         {
24             a[k]=i;if(i%2==1)dfs(k+1,0);
25             else dfs(k+1,1);
26         }
27     }
28     else
29     {
30         for(int i=0;i<B;++i)
31         {
32             a[k]=i;if(i%2==1)dfs(k+1,1);
33             else dfs(k+1,0);
34         }
35     }
36 }
37 int main()
38 {
39     scanf("%d%d",&n,&B);
40     dfs(1,0);
41     return 0;
42 }

 

转载于:https://www.cnblogs.com/CHerish_OI/p/8817712.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值