有一条长度为n的赛道,其中有m个陷阱,这些陷阱都位于整数位置,分别是a1,a2,....am,陷入其中则必死无疑。
开始时小人站在位置1,小人一次只能向前跳一步或两步。显然,如果有两个挨着的陷阱,小人是无论如何也跳不过去的。
现在给出赛道的长度n,陷阱的个数m及位置。问有多少种跳跃方案可以让小人到达终点(位置n)。
数据规模和约定:( 40>=n>=3, m>=1, n>m; 陷阱不会位于1及n上 )
输入格式:第一行为两个整数n,m 第二行为m个整数,表示陷阱的位置
输出格式:一个整数。表示小人跳到n的方案数
输入样例:在这里给出一组输入。例如:
8 2 5 7 输出样例:在这里给出相应的输出。例如:
3网上搜了搜题解,发现都是用dp做的,然鹅我不会dp,就用深搜做了以下,感觉不难。
1 #include <iostream> 2 #include <string> 3 #include <string.h> 4 using namespace std; 5 int n, m, counts; 6 int a[41]; 7 void dfs(int x, int step) { 8 if(x > n) { 9 return; 10 } 11 if(x == n) { 12 counts++; 13 return; 14 } 15 if(a[x+1] != 1) { 16 dfs(x+1, step+1); 17 } 18 if(a[x+2] != 1) { 19 dfs(x+2, step+2); 20 } 21 } 22 int main() 23 { 24 25 cin >> n >> m; 26 //memset(a,1,sizeof(a)); 27 while(m--) { 28 int x; 29 cin >> x; 30 a[x] = 1; 31 } 32 dfs(1, 0); 33 cout << counts; 34 }