信息学奥赛一本通 1196:踩方格 递推算法
请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。时间限制: 1000 ms内存限制: 65536 KB。a、每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;有一个方格矩阵,矩阵边界在无穷远处。b、走过的格子立即塌陷无法再走第二次;允许在方格上行走的步数n(n≤20)。c、只能向北、东、西三个方向走;
1196:踩方格
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:
a、每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;
b、走过的格子立即塌陷无法再走第二次;
c、只能向北、东、西三个方向走;
请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。
【输入】
允许在方格上行走的步数n(n≤20)。
【输出】
计算出的方案数量。
【输入样例】
2
【输出样例】
7
解析:递推,对于当前步骤(i),前一步(i-1)东西走的,都有两种走法,向北走的有3种走法,上一步向北的走法数量刚好是大上一步(i-2)(因为大上一步每种走法都可以向北走一步),所以当前步骤的走法=上一步(i-1)*2+大上一步(i-2)详见代码:
#include <bits/stdc++.h>
using namespace std;
long long a[25];
int n;
int main() {
cin >> n;
a[1] = 3;
a[2] = 7;
for(int i = 3; i <= n; i++) {
a[i] = a[i - 1] * 2 + a[i - 2];
}
cout << a[n];
return 0;
}
另一种递推:第一步向东西走的是2步(东西各一步),向北走的一步,第二步开始向北走的是上一步东西和北的和,向东西走的是上一步向北的2倍+向东西的一倍(原来向东的不能向西,向西的不能向东),详见代码:
#include <bits/stdc++.h>
using namespace std;
long long a[25];//向北步数
long long b[25];//向东西的步数
int n;
int main() {
cin >> n;
a[1] = 1;
b[1] = 2;
for(int i = 2; i <= n; i++) {
a[i] = a[i - 1] + b[i - 1];
b[i] = 2 * a[i - 1] + b[i - 1];
}
cout << a[n] + b[n];
return 0;
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)