本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2024-04-20 14:56:26
一眼大模拟。
题意
不多说了
思路
题目中已经告诉了俄罗斯方块7种形状。想要让任何一列只有底部连续若干行有方块,我们需要分类讨论。

1
分两种情况,横放和竖放。
竖放
竖放在哪一列放都行。
横放
横放需要有四个连续相等的高度。
if(m==1){
for(int i=1;i<=n-3;i++){
if(a[i]==a[i+1]&&a[i+1]==a[i+2]&&a[i+2]==a[i+3]){
cnt++;
}
}
cout<<cnt+n;
}
2
我们发现横放和竖放都是一种图形。
横放+竖放
需要两个连续相等的高度
if(m==2){
for(int i=1;i<n;i++){
if(a[i]==a[i+1]){
cnt++;
}
}
cout<<cnt;
}
3
分横放和竖放。
横放
横放需要前两个高度相等,第三个比第二个高 $1$。
竖放
竖放第一个比第二个高 $1$。
if(m==3){
for(int i=1;i<=n-2;i++){
if(a[i]==a[i+1]&&a[i+2]-a[i+1]==1){
cnt++;
}
}
for(int i=1;i<=n-1;i++){
if(a[i]-a[i+1]==1){
cnt++;
}
}
cout<<cnt;
}
4
和 3 几乎一样,不过方向反了。
if(m==4){
for(int i=1;i<=n-2;i++){
if(a[i+2]==a[i+1]&&a[i]-a[i+1]==1){
cnt++;
}
}
for(int i=1;i<=n-1;i++){
if(a[i+1]-a[i]==1){
cnt++;
}
}
cout<<cnt;
}
5
分正放,竖放,倒放,
正放
正放需要三个相同的高度。
竖放
竖放分两种情况
顺时针90°
第二个比第一个高 $1$。
逆时针90°
第一个比第二个高 $1$。
倒放
第二个比第一个和第三个少 $1$。
if(m==5){
for(int i=1;i<=n-2;i++){\/\/正放
if(a[i]==a[i+1]&&a[i+1]==a[i+2]){
cnt++;
}
}
for(int i=1;i<=n-1;i++){\/\/逆时针90
if(a[i]-a[i+1]==1){
cnt++;
}
}
for(int i=1;i<=n-1;i++){\/\/顺时针90
if(a[i]-a[i+1]==-1){
cnt++;
}
}
for(int i=1;i<=n-2;i++){\/\/倒放
if(a[i]-a[i+1]==1&&a[i+2]-a[i+1]==1){
cnt++;
}
}
cout<<cnt;
}
6
分正放,竖放,倒放,
正放
正放需要三个相同的高度。
竖放
竖放分两种情况
顺时针90°
需要两个相同的高度
逆时针90°
第一个比第二个高 $2$。
倒放
第一个比第二个和第三个少 $1$。
if(m==6){
for(int i=1;i<=n-2;i++){
if(a[i]==a[i+1]&&a[i+1]==a[i+2]){
cnt++;
}
}
for(int i=1;i<=n-1;i++){
if(a[i]-a[i+1]==2){
cnt++;
}
}
for(int i=1;i<n;i++){
if(a[i]==a[i+1]){
cnt++;
}
}
for(int i=1;i<=n-2;i++){
if(a[i]-a[i+1]==-1&&a[i+2]-a[i+1]==0){
cnt++;
}
}
cout<<cnt;
}
7
分正放,竖放,倒放,
正放
正放需要三个相同的高度。
竖放
竖放分两种情况
顺时针90°
第二个比第一个高 $2$。
逆时针90°
需要两个相同的高度。
倒放
第三个比一个和第二个少 $1$。
if(m==7){
for(int i=1;i<=n-2;i++){
if(a[i]==a[i+1]&&a[i+1]==a[i+2]){
cnt++;
}
}
for(int i=1;i<=n-1;i++){
if(a[i]-a[i+1]==-2){
cnt++;
}
}
for(int i=1;i<n;i++){
if(a[i]==a[i+1]){
cnt++;
}
}
for(int i=1;i<=n-2;i++){
if(a[i]-a[i+1]==0&&a[i+2]-a[i+1]==-1){
cnt++;
}
}
cout<<cnt;
}
创作不易,请三连(关注作者+点赞+收藏),感激不尽。

鲁ICP备2025150228号