【一句话题意】给定一种俄罗斯方块和游戏底部的方块状态,求方块全触底的放置方案数(方块可旋转,相同形状算一种)
【分析】简单模拟题,注意七类分类讨论时理清思路。
【code】
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=110;
int c,p,cnt=0;
int h[maxn];
int main(){
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
cin>>c>>p;
for(int i=1;i<=c;i++)
cin>>h[i];
if(p==1){
cnt+=c;
for(int i=1;i<=c-4+1;i++)
if(h[i]==h[i+1]&&h[i+1]==h[i+2]&&h[i+2]==h[i+3]) cnt++;
}
else if(p==2){
for(int i=1;i<=c-2+1;i++)
if(h[i]==h[i+1]) cnt++;
}
else if(p==3){
for(int i=1;i<=c-3+1;i++)
if(h[i]==h[i+1]&&h[i+1]==h[i+2]-1) cnt++;
for(int i=1;i<=c-2+1;i++)
if(h[i]-1==h[i+1]) cnt++;
}
else if(p==4){
for(int i=1;i<=c-3+1;i++)
if(h[i]-1==h[i+1]&&h[i+1]==h[i+2]) cnt++;
for(int i=1;i<=c-2+1;i++)
if(h[i]==h[i+1]-1) cnt++;
}
else if(p==5){
for(int i=1;i<=c-3+1;i++)
if(h[i]==h[i+1]&&h[i+1]==h[i+2]) cnt++;
for(int i=1;i<=c-2+1;i++)
if(h[i]==h[i+1]-1) cnt++;
for(int i=1;i<=c-2+1;i++)
if(h[i]-1==h[i+1]) cnt++;
for(int i=1;i<=c-3+1;i++)
if(h[i]-1==h[i+1]&&h[i+1]==h[i+2]-1)cnt++;
}
else if(p==6){
for(int i=1;i<=c-3+1;i++)
if(h[i]==h[i+1]&&h[i+1]==h[i+2]) cnt++;
for(int i=1;i<=c-3+1;i++)
if(h[i]==h[i+1]-1&&h[i+1]-1==h[i+2]-1) cnt++;
for(int i=1;i<=c-2+1;i++)
if(h[i]==h[i+1]) cnt++;
for(int i=1;i<=c-2+1;i++)
if(h[i]-2==h[i+1]) cnt++;
}
else if(p==7){
for(int i=1;i<=c-3+1;i++)
if(h[i]==h[i+1]&&h[i+1]==h[i+2]) cnt++;
for(int i=1;i<=c-3+1;i++)
if(h[i]-1==h[i+1]-1&&h[i+1]-1==h[i+2]) cnt++;
for(int i=1;i<=c-2+1;i++)
if(h[i]==h[i+1]) cnt++;
for(int i=1;i<=c-2+1;i++)
if(h[i]==h[i+1]-2) cnt++;
}
cout<<cnt<<endl;
return 0;
}