E2-D-Zexal的过河

本文探讨了Zexal如何安全地通过河中石砖抵达对岸的问题,提供了两种算法思路,一种使用二维数组记录不同跳跃方式的数量,另一种则采用一维数组存储到达每个石砖的总方法数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

Zexal打算借助河中间的石砖过到河对岸去。Zexal从第一块石砖出发,接下来他可以走到第二块石砖或第三块石砖,有时候走的很不爽,甚至可以直接跨过两个石砖,到达第四块石砖,但是不能连续两次这种操作,因为这样消耗体能比较大。现在假设河中含n块石砖,且这些石砖呈直线分布,请你计算出Zexal从第一块石砖出发有多少种安全的过河方法。

输入
输入将由多组测试数据组成,以EOF结尾。

每组数据只有一行,为河中的总石砖数n(0<n≤50)。

输出
对于每组数据,输出一行,为过河的方法数。

输入样例

1
2
3

输出样例

1
2
4

样例解释
1:一步走完;
2:先走到2再走完,或者直接走完;
3:111或12或21或3。

思路分析

思路1:
设置一个60×2的数组。第i行代表到达第i个石块所用方法数。
其中每一行的第一列代表上一次使用1跳或2跳达到此处的方法数。第二列代表上一次使用3跳到达此处的方法数。
先设置好前三行的元素数,从第四行开始:
对于第i行,上一次使用1跳到达此处的方法数为i-1的所有方法数,即a[i-1][0]+a[i-1][1]。上一次使用2跳到达此处的方法数为a[i-2][0]+a[i-2][1]。
即a[i][0] = a[i-1][0]+a[i-1][1]+a[i-2][0]+a[i-2][1]
若上次使用3跳到达此处,则上上次不可使用3跳
即a[i][1] = a[i-3][0]
(不加a[i-3][1])
思路2:
使用一个一维数组存储到达每一个石头的总方法数
先设置好前五个数
从第六个数开始,对于第i个数:
如果使用1跳到达此处,方法数为a[i-1]
如果使用2跳到达此处,方法数为a[i-2]
如果使用3跳到达此处,则不是使用3跳到达i-3的,即使用3跳到达i的方法数等于使用1跳或2跳到达i-3的方法数,即a[i-4]+a[i-5]

AC代码

思路1:

#include<stdio.h>
long long a[60][2],n;
int main()
{
	int i;
	a[1][0]=1;
	a[1][1]=0;
	a[2][0]=2;
	a[2][1]=0;
	a[3][0]=3;
	a[3][1]=1;
	for(i=4;i<=50;i++)
	{
		a[i][0]=a[i-1][0]+a[i-1][1]+a[i-2][0]+a[i-2][1];
		a[i][1]=a[i-3][0];
	}
	while((scanf("%d",&n))!=EOF)
	{
		printf("%lld\n",a[n][0]+a[n][1]);
	}
	return 0;
}

思路2:

#include<stdio.h>
long long a[60],n;
int main()
{
	int i;
	a[1]=1;
	a[2]=2;
	a[3]=4;
	a[4]=7;
	a[5]=13;
	for(i=6;i<=50;i++)
	{
		a[i]=a[i-1]+a[i-2]+a[i-4]+a[i-5];
	}
	while((scanf("%d",&n))!=EOF)
	{
		printf("%lld\n",a[n]);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值