俄罗斯方块(NOIP模拟赛)(水·模拟)

真是一道神奇的题目233~

原题传送门

迫不得已贴了个题解的链接。。

好吧,这道题就是分情况讨论,纯模拟,,

没有什么难的。。

脑洞要大,四面都要考虑,不能漏!

#include<iostream>
#include<cstdio>
using namespace std;
int c,p,ans;
int l[101];
int absq(int a,int b){return a>b?a-b:b-a;}
int main(){
    freopen("game.in","r",stdin);
    freopen("game.out","w",stdout);
    scanf("%d%d",&c,&p);
    for(int i=1;i<=c;i++)
    scanf("%d",&l[i]);
    if(p==1){
        ans+=c;
        for(int i=4;i<=c;i++)
        if((l[i]==l[i-1])&&(l[i-1]==l[i-2])&&(l[i-2]==l[i-3]))
        ans++;
    }
    else if(p==2){
    for(int i=2;i<=c;i++)
    if(l[i]==l[i-1])ans++;    
    }
    else if(p==3){
        for(int i=2;i<=c;i++)
        if(l[i-1]-l[i]==1)ans++;
        for(int i=3;i<=c;i++)
        if(l[i-2]==l[i-1]&&l[i]-l[i-1]==1)ans++;
    }
    else if(p==4){
        for(int i=2;i<=c;i++)
        if(l[i]-l[i-1]==1)ans++;
        for(int i=3;i<=c;i++)
        if(l[i-2]-l[i-1]==1&&l[i-1]==l[i])ans++;
    }
    else if(p==5){
        for(int i=2;i<=c;i++)
        if(absq(l[i],l[i-1])==1)ans++;
        for(int i=3;i<=c;i++)
        if((l[i]==l[i-1])&&(l[i-1]==l[i-2]))ans++;
        for(int i=2;i<c;i++)
        if(l[i-1]-l[i]==1&&l[i+1]-l[i]==1)ans++;
    }
    else if(p==6){
        for(int i=3;i<=c;i++)
        if((l[i]==l[i-1])&&l[i-1]==l[i-2])ans++;
        for(int i=2;i<=c;i++)
        if(l[i]==l[i-1])ans++;
        for(int i=3;i<=c;i++)
        if ((l[i-1]-l[i-2]==1)&&(l[i]==l[i-1]))ans++;
        for(int i=2;i<=c;i++)
        if (l[i-1]-l[i]==2)ans++;
    }
    else if(p==7){
        for(int i=3;i<=c;i++)
        if((l[i]==l[i-1])&&l[i-1]==l[i-2])ans++;
        for(int i=2;i<=c;i++)
        if(l[i]==l[i-1])ans++;    
        for(int i=3;i<=c;i++)
        if ((l[i-1]==l[i-2])&&(l[i-1]-l[i]==1))ans++;    
        for(int i=2;i<=c;i++)
        if (l[i]-l[i-1]==2)ans++;        
    }
    printf("%d
",ans);
    fclose(stdin);
    fclose(stdout);
}
原文地址:https://www.cnblogs.com/ghostfly233/p/6882533.html