2018年第九届蓝桥杯 - 国赛 - C/C++大学B组 - B. 激光样式

激光样式

x星球的盛大节日为增加气氛,用30台机光器一字排开,向太空中打出光柱。

安装调试的时候才发现,不知什么原因,相邻的两台激光器不能同时打开!

国王很想知道,在目前这种bug存在的情况下,一共能打出多少种激光效果?

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

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

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

DFS

先声明一个light[31]数组表示30个灯,0代表不亮,1代表亮;从0开始搜索,如果搜索到30说明是一种解决方案,n++;如果前一个灯是0,那么当前灯标记为1继续搜索,搜索完之后要回溯将当前灯标记为0;之后再搜索下一个灯。

Python

def dfs(idx):if idx == 30:global ansans += 1returnif light[idx - 1] == 0:light[idx] = 1dfs(idx + 1)light[idx] = 0dfs(idx + 1)if __name__ == '__main__':ans, light = 0, [0] * 30dfs(0)print(ans)

C++

#include 
#include using namespace std;int light[31];
long long n=0;void dfs(int num) {if (num == 30) {n++;return;}if (light[num - 1] == 0) {light[num] = 1;dfs(num + 1);light[num] = 0;}dfs(num + 1);
}int main() {dfs(0);cout << n << endl;return 0;
}

Answer:2178309


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部