7-5 跳一跳(30 分)

有一条长度为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 }
 
 
 

猜你喜欢

转载自www.cnblogs.com/wzy-blogs/p/9161485.html