洛谷P2437 蜜蜂路线

题目大意:

一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房 m m m 开始爬到蜂房 n , m < n n,m<n nm<n,有多少种爬行路线?(备注:题面有误,右上角应为 n − 1 n-1 n1
请添加图片描述

说明/提示:

对于 100 100 100%的数据, 1 ≤ M , N ≤ 1000 1≤M,N≤1000 1M,N1000

思路/分析:

n , m n,m n,m 是输入的蜂房, t t t 是存 n − m n-m nm 的, a a a 数组存走法, p d pd pd 判断输出的最高位是不是 0 0 0
主函数首先输入 m m m n n n t t t n − m n-m nm。特判 0 , 1 , 2 0,1,2 0,1,2 这三个数,因为这 3 3 3 个是已知的。
3 3 3 开始循环,一直到 t t t,主要的高精代码在前面解释了就不多说了。
然后该输出 n n n 的结果了,从 600 600 600 循环到 2 2 2 ,如果该位是 0 0 0 且是最高位,那么不满足数字的要求,就循环下一位,如果该位 ! = 0 !=0 !=0,那么 p d pd pd 变成 1 1 1,证明如果再出现 0 0 0 就不是最高位了,可以输出 0 0 0

注意:最后的个位是不能在循环里输出的,因为个位比较特殊,如果 n n n 0 0 0 的话,按照循环里面的规则的不满足输出数的规律的,所以最后一位放到循环里面的话, n = 0 n=0 n=0 是输出不了正确答案的,所以个位要放循环外面特判,这样就满足了所有的条件,这道题就能过了

代码:

#include <bits/stdc++.h>
using namespace std;
int n,m,t;
bool pd = 0;
int a[1000][1000];
int main(){
	cin >> m >> n;
	t = n - m;
	a[0][1] = 0;
	a[1][1] = 1;
	a[2][1] = 2;
	for(int i = 3;i <= t;i++){
		for(int j = 1;j < 600;j++) 
		a[i][j] = a[i - 1][j] + a[i - 2][j];
		for(int j = 1;j < 600;j++){
			while(a[i][j] > 9){
				a[i][j + 1]++;
				a[i][j] -= 10;
			}
		}
	}
	for(int i = 600;i > 1;i--){
		if(!pd && a[t][i] == 0){
			continue;
		}
		pd = 1;
		cout << a[t][i];
	}
	cout << a[t][1];
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值