P a r t Part Part 1 1 1 读题
从原点出发,一步只能向右走、向上走或向左走。恰好走 N N N步且不经过已走的点共有多少种走法?
输入格式
读入一个数 N N N( 1 ≤ N ≤ 1000 1≤N≤1000 1≤N≤1000)。
输出格式
输出数量总数(最终结果需模 12345 12345 12345)
输入样例
2
输出样例
7
数据范围与提示
1 ≤ N ≤ 1000 1≤N≤1000 1≤N≤1000
P a r t Part Part 2 2 2 思路
设 f [ i ] f[i] f[i]表示走 i i i步的方案。那么递推式就等于: f [ i ] = f [ i ] . 上 + f [ i ] . 左 + f [ i ] . 右 f[i]=f[i].上+f[i].左+f[i].右 f[i]=f[i].上+f[i].左+f[i].右
f [ i ] . 上 f[i].上 f[i].上(第 i i i步向上的方案数)就等于 f [ i − 1 ] f[i-1] f[i−1],因为上一步的每一种方案都可以向上走.
f [ i ] . 左 f[i].左 f[i].左(第 i i i步向左的方案数)就等于 f [ i − 1 ] . 上 + f [ i − 1 ] . 左 f[i-1].上+f[i-1].左 f[i−1].上+f[i−1].左,因为不能走已走的点,所以 f [ i ] . 右 f[i].右 f[i].右要排除.
f [ i ] . 右 f[i].右 f[i].右(第 i i i步向右的方案数)就等于 f [ i − 1 ] . 上 + f [ i − 1 ] . 右 f[i-1].上+f[i-1].右 f[i−1].上+f[i−1].右,因为不能走已走的点,所以 f [ i ] . 左 f[i].左 f[i].左要排除。
故可得:
f[i]=f[i-1]+f[i-1].上+f[i-1].上+f[i-1].左+f[i-1],右
=f[i-1]+f[i-1].上+(f[i-1].上+f[i-1].左+f[i-1],右)
=f[i-1]+f[i-1]+f[i-1].上
=2*f[i-1]+f[i-2]
P a r t Part Part 3 3 3 代码
#include<bits/stdc++.h>
using namespace std;
int n,f[1010];
int main(){
scanf("%d",&n);
f[0]=1,f[1]=3;
for(int i=2;i<=n;i++) f[i]=(f[i-1]*2+f[i-2])%12345;
printf("%d",f[n]%12345);
return 0;
}
听完后,是不是觉得很简单呢?赶快自己去试一下吧!!!