原题链接:蓝桥杯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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复