算法提高 超级玛丽
文章转载于zhangyaoya
描述
大家都知道"超级玛丽"是一个很善于跳跃的探险家,他的拿手好戏是跳跃,但它一次只能向前跳一步或两步。有一次,他要经过一条长为n的羊肠小道,小道中有m个陷阱,这些陷阱都位于整数位置,分别是a1,a2,…am,陷入其中则必死无疑。显然,如果有两个挨着的陷阱,则玛丽是无论如何也跳过不去的。
现在给出小道的长度n,陷阱的个数及位置。求出玛丽从位置1开始,有多少种跳跃方法能到达胜利的彼岸(到达位置n)。
输入
输入描述:
第一行为两个整数n,m
第二行为m个整数,表示陷阱的位置
输入样例:
4 1
2
输出
输出描述:
一个整数。表示玛丽跳到n的方案数
输出样例:
1
使用了递归的方式
import java.util.Scanner;
public class Main {
static int n,m;
static int[] a;
static int ans=0;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
a = new int[m];
for (int i = 0; i < m; i++) {
a[i]=scanner.nextInt();
}
f(1,a,0);
System.out.println(ans);
}
//i代表你现在所处的位置
//j=0,可以排除第一个位置有炸弹的情况
//第一个位置是出发位,如果是炸弹,那么必死,这道题就没有意义
private static void f(int i, int[] a, int j) {
if (j>n) {
return;
}
if (j==n) {
ans++;
//到了终点ans才加一
return ;
}
for (int j2 = 0; j2 < m; j2++) {
if (j==a[j2]) {
return ;
}
}
f(i+2, a, j=i+2);//f(2,a,2)
f(i+1, a, j=i+1);//f(3,a,3)
//过了第一个位置后i=j
//有可能走一步也有可能走两步
}
}