一个人走一个n阶的楼梯,他一步可以走1阶,2阶,3阶,这三种情况,问走完这n阶的楼梯共有多少种不同的走法?

来源:互联网 发布:js全屏幻灯片切换效果 编辑:程序博客网 时间:2024/06/02 08:24

当时脑子不够用,10级楼梯嘛,每一次至少走一步,走完10步最多10次,那么用10个循环可以搞定,够傻逼的吧,看下面。

int method_num = 0;int judge_num = 0;bool judge(int total){judge_num++;if(total > 10)return false;else if(total == 10)++method_num;return true;}void zoulouti2(){for(int i = 1; i <= 3; ++i) {int total = i;if(!judge(total))break;else {for(int j = 1; j <=3; ++j) {total += j;if(!judge(total))break;else {for(int k = 1; k <= 3; ++k) {total += k;if(!judge(total))break;else {for(int l = 1; l <= 3; ++l) {total += l;if(!judge(total))break;else {for(int m = 1; m <= 3; ++m) {total += m;if(!judge(total))break;else {for(int n = 1; n <= 3; ++n) {total += n;if(!judge(total))break;else {for(int o = 1; o <= 3; ++o) {total += o;if(!judge(total))break;else {for(int p = 1; p <= 3; ++p) {total += p;if(!judge(total))break;else {for(int q = 1; q <= 3; ++q) {total += q;if(!judge(total))break;else {for(int r = 1; r <= 3; ++r) {total += r;if(!judge(total))break;}}}}}}}}}}}}}}}}}}}}



这么长,这么粗,引以为戒呀,这代码写给谁看呢,程序员要学会偷懒,代码越精悍越优。

 

以10级楼梯为例,每次可以走1步、2步、3步,,那么前7步的走法再走3步或者,前8步的走法再走2步,前9步的走法最后走1步,这些步绝对就不会重复了,因为它们的最后一步是不同的。问题就转化为计算前7、8、9步的走法数了。于是有递推公式f(n) = f(n - 1) + f(n - 2) + f(n - 3)

为了加快计算的速度,把计算过的楼梯级使用vector缓存(最喜欢用vector了,但还没精通,失礼失礼)

#include <iostream>#include <vector>using namespace std;static vector<int> louti;int zoulouti1(int n){if(n <= louti.size()) // 已经计算过的楼梯级,直接返回vector里面的值即可return louti[n - 1];int i = louti.size();while(i < n) {// f(n) = f(n - 1) + f(n - 2) + f(n - 3)int zoufa = louti[i - 1] + louti[i - 2] + louti[i - 3];louti.push_back(zoufa);++i;}return louti.back();}void init_louti(){// 只有1、2、3级楼梯,对应的走法louti.push_back(1);louti.push_back(2);louti.push_back(4);}int main(){cout << "请输入楼梯级数:";int n = 0;cin >> n;init_louti();cout << n << "级楼梯的走法有:" << zoulouti1(n) << "种" << endl;}

原创粉丝点击