原题链接:蓝桥杯2022年第十三届省赛真题-积木画
解题思路:
https://www.bilibili.com/video/BV18i4y1D7cJ?spm_id_from=333.999.0.0
1:05:00开始看
map[j][k] 相当于是一张表格,如果左边一列开始是已j的状态的,那么k为该状态下的放法
a[i][k] 表示第i列时所处于的k种状态
所以当i+1时若要处于的k状态,就要看前一列出与j状态的情况下,是否在map中能找到,使得格子能从第j中状态转换到第k中状态的方式。
f开空间可能会过大,用循环数组,&1相当于%2;
看代码的大佬能讲解一下为什么将 int f[2][4]放在主函数里面会报错吗?
参考代码:
#include<iostream> #include<cstring> using namespace std; int map[4][4]={ {1,1,1,1}, {0,0,1,1}, {0,1,0,1}, {1,0,0,0}, }; int f[2][4]; int main() { int n; cin>>n; f[1][0]=1; for(int i=1;i<=n;i++) { memset(f[(i+1)&1],0,sizeof(f[0])); for(int j=0;j<4;j++) { for(int k=0;k<4;k++) { f[(i+1)&1][k]=(f[(i+1)&1][k]+f[i&1][j]*map[j][k])%1000000007; } } } cout<<f[(n+1)&1][0]<<endl; return 0; }
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复