【搜索】激光样式

标题:激光样式


x星球的盛大节日为增加气氛,用30台机光器一字排开,向太空中打出光柱。
安装调试的时候才发现,不知什么原因,相邻的两台激光器不能同时打开!
国王很想知道,在目前这种bug存在的情况下,一共能打出多少种激光效果?


显然,如果只有3台机器,一共可以成5种样式,即:
全都关上(sorry, 此时无声胜有声,这也算一种)
开一台,共3种
开两台,只1种


30台就不好算了,国王只好请你帮忙了。


要求提交一个整数,表示30台激光器能形成的样式种数。

【题解】:

搜索即可,但是注意需要一点优化设立第二个参数直接从第二个参数+2,进行操作。

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int vis[34];
 4 int n,ans;
 5 int t ;
 6 bool check() {  
 7     for(int i=1;i<=t;i++){
 8         if( vis[i] && vis[i+1] ){
 9             return false;
10         }
11     }
12     return true;
13 }
14 void dfs(int step,int pos ){
15     if( step == n && check() ){
16         ans++;
17         return ;
18     }
19     for(int i=pos+2;i<=t;i++){
20         if( vis[i]==0 && vis[i-1] == 0 ){
21             vis[i] = 1;
22             dfs( step+1 , i );
23             vis[i] = 0;
24         }
25     }
26 }
27 int main()
28 {
29     scanf("%d",&t);
30     memset(vis,0,sizeof(vis));
31     for(int i=1;i<=(t-1)/2+1;i++){
32         n = i;
33         dfs(0,-1);
34     }
35     ans++;
36     printf("%d\n",ans);
37 }
View Code

 

posted @ 2019-05-20 21:11  Osea  阅读(175)  评论(0编辑  收藏  举报