7-10 跳一跳

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

学校实验室纳新的一道题:

方法一:斐波那契数列的变形

#include<stdio.h>
int main()
{
	int n,m;
	scanf("%d %d",&n,&m);
	int t[40];
	int xianjing[40],flag=0;
	for(int i=0;i<=n;i++)
	 t[i]=1;
	for(int i=1;i<=m;i++)
	{
		scanf("%d",&xianjing[i]);
		t[xianjing[i]]=0;
		if(i>1)
		{
			if(xianjing[i]-xianjing[i-1]==1||xianjing[i]-xianjing[i-1]==-1)
			   flag=1;
		}
	}
	if(flag)
	  printf("0");
	else
	{
		for(int i=3;i<=n;i++)
		{
			if(t[i]==0)
			 continue;
			else
			{
				t[i]=t[i-1]+t[i-2];
			}
		}
		
		
	}
	printf("%d",t[n]);
	return 0;
}

方法二:深度优先搜索

#include<stdio.h>
int n,m,cnt;
int a[40];
void dfs(int x)
{
	if(x>n)
	  return;
	if(x==n)
	{
		cnt++;
	  return;
	  
	}
	if(a[x+1]!=1)
	{
		dfs(x+1);
	}
	if(a[x+2]!=1)
	{
		dfs(x+2);
	}
}
int main()
{
	scanf("%d %d",&n,&m);
	while(m--)
	{
		int x;
		scanf("%d",&x);
		a[x]=1;
	}
	dfs(1);
	
	printf("%d",cnt);
	return 0;
}

阅读更多
相关热词
换一批

没有更多推荐了,返回首页