第一题:一个人上台阶可以一次上1个,2个,或者3个,问这个人上n层的台阶,总共有几种走法?
void print(int x)
{
printf("%d ", x);
}
void louti(int n)
{
vector<char> sk;
sk.push_back(1);
int cur_stair = 1;
while(true){
if(cur_stair > n || sk[sk.size()-1] == 4){
cur_stair -= sk[sk.size()-1];
sk.pop_back();
if(sk.empty ())
break;
sk[sk.size()-1]++;
cur_stair++;
continue;
}
if(cur_stair == n){
for_each(sk.begin(), sk.end(), print);
printf("\n");
cur_stair += 4-sk[sk.size() - 1];
sk[sk.size() - 1] = 4;
continue;
}
cur_stair++;
sk.push_back (1);
}
}
int louti_r(int n, bool first)
{
static vector<char> sk;
static int cur_stair = 0;
static int count = 0;//计数总的方案数
if(first == true){
sk.clear();
cur_stair = 0;
count = 0;
}
if(cur_stair > n){
return count;
}else if(cur_stair == n){
count++;
for_each(sk.begin(), sk.end(), print);
printf("\n");
return count;
}
for(int i = 1; i < 4; i++){
sk.push_back (i);
cur_stair += i;
louti_r(n, false);
cur_stair -= i;
sk.pop_back ();
}
return count;
}