2017 东北四省赛热身赛 C

本文介绍了一种模拟俄罗斯方块游戏的方法,通过设定方块类型、方向和初始位置,实现方块落下并统计可消除层数的过程。文章提供了一段C++代码示例,详细展示了如何进行模拟。

原题:清华大学出题(侵删)




题意:

模拟俄罗斯方块游戏给出 N 个方块,限高为 M

对于 N 个方块给出 方块的类型 ,方块的方向,方块的最左端的列数。问 N 个方块径直下落后,共可以消除几层?游戏过程中保证不超出限高。

思路:

模拟

代码:

不知道对不对

#include <bits/stdc++.h>
using namespace std;
char kuai;
int n,m,fangxiang,lie,h[15],w[500050];
bool mp[11][500050];
int high,ans,tt;
void debug(){
    cout<<"debug:"<<endl;
    cout<<"high:"<<high<<endl;
    for(int i=0;i<10;i++)
        cout<<h[i]<<' ';cout<<endl;
    for(int i=0;i<=tt;i++)
        cout<<"w:"<<i<<"="<<w[i]<<endl;
    for(int i=tt;i>0;i--){
        for(int j=0;j<10;j++){
            cout<<mp[j][i]<<' ';
        }
        cout<<endl;
    }

}
void check(){
    tt=h[0];
    for(int i=1;i<10;i++) tt=max(h[i],tt);
    for(int i=high+1;i<=high+4;i++){
        if(w[i]==10){
            int offset=0;
            while(1){
                if(w[i]==10){
                    offset++;ans++;
                    w[i]=0;
                }else break;
                i++;
            }
            int l;
            for(int j=i-offset;j<=tt;j++){
                l=0;
                for(int k=0;k<10;k++){
                    mp[k][j]=mp[k][j+offset];
                    if(mp[k][j]) l++;
                }
                w[j]=l;
            }
            for(int j=0;j<10;j++){
                h[j]-=offset;
                while(high>0&&mp[j][high]==0){
                    h[j]--;
                    high--;
                }
            }
            break;
        }
    }
}
void luo(){
    scanf("%c %d %d",&kuai,&fangxiang,&lie);getchar();
    if(kuai=='A'){
        high=max(h[lie],h[lie+1]);
        h[lie]=high+2;h[lie+1]=high+2;
        w[high+1]+=2;w[high+2]+=2;
        mp[lie][high+1]=1;mp[lie][high+2]=1;mp[lie+1][high+1]=1;mp[lie+1][high+2]=1;
    }else if(kuai=='B'){
        if(fangxiang==0||fangxiang==2){
            high=h[lie];
            h[lie]=high+4;
            for(int i=1;i<=4;i++) w[high+i]++;
            mp[lie][high+1]=1;mp[lie][high+2]=1;mp[lie][high+3]=1;mp[lie][high+4]=1;
        }else{
            high=h[lie];for(int i=1;i<4;i++) high=max(high,h[lie+i]);
            for(int i=0;i<4;i++) h[lie+i]=high+1;
            w[high+1]+=4;
            mp[lie][high+1]=1;mp[lie+1][high+1]=1;mp[lie+2][high+1]=1;mp[lie+3][high+1]=1;
        }
    }else if(kuai=='C'){
        if(fangxiang==0){
            high=max(h[lie],max(h[lie+1],h[lie+2]));
            h[lie]=high+2;h[lie+1]=high+1;h[lie+2]=high+1;
            w[high+1]+=3;w[high+2]++;
            mp[lie][high+1]=1;mp[lie][high+2]=1;mp[lie+1][high+1]=1;mp[lie+2][high+1]=1;
        }else if(fangxiang==1){
            high=max(h[lie],h[lie+1]);
            h[lie]=high+1;h[lie+1]=high+3;
            w[high+1]+=2;w[high+2]++;w[high+3]++;
            mp[lie][high+1]=1;mp[lie+1][high+1]=1;mp[lie+1][high+2]=1;mp[lie+1][high+3]=1;
        }else if(fangxiang==2){
            high=max(h[lie]-1,max(h[lie+1]-1,h[lie+2]));
            h[lie]=high+2;h[lie+1]=high+2;h[lie+2]=high+2;
            w[high+1]++;w[high+2]+=3;
            mp[lie][high+2]=1;mp[lie+1][high+2]=1;mp[lie+2][high+1]=1;mp[lie+2][high+2]=1;
        }else if(fangxiang==3){
            high=max(h[lie],h[lie+1]-2);
            h[lie]=high+3;h[lie+1]=high+3;
            w[high+1]++;w[high+2]++;w[high+3]+=2;
            mp[lie][high+1]=1;mp[lie][high+2]=1;mp[lie][high+3]=1;mp[lie+1][high+3]=1;
        }
    }else if(kuai=='D'){
        if(fangxiang==0){
            high=max(h[lie],max(h[lie+1],h[lie+2]));
            h[lie]=high+1;h[lie+1]=high+1;h[lie+2]=high+2;
            w[high+1]+=3;w[high+2]++;
            mp[lie][high+1]=1;mp[lie+1][high+1]=1;mp[lie+2][high+1]=1;mp[lie+2][high+2]=1;
        }else if(fangxiang==1){
            high=max(h[lie]-2,h[lie+1]);
            h[lie]=high+3;h[lie+1]=high+3;
            w[high+1]++;w[high+2]++;w[high+3]+=2;
            mp[lie][high+3]=1;mp[lie+1][high+1]=1;mp[lie+1][high+2]=1;mp[lie+1][high+3]=1;
        }else if(fangxiang==2){
            high=max(h[lie],max(h[lie+1]-1,h[lie+2]-1));
            h[lie]=high+2;h[lie+1]=high+2;h[lie+2]=high+2;
            w[high+1]++;w[high+2]+=3;
            mp[lie][high+1]=1;mp[lie][high+2]=1;mp[lie+1][high+2]=1;mp[lie+2][high+2]=1;
        }else if(fangxiang==3){
            high=max(h[lie],h[lie+1]);
            h[lie]=high+3;h[lie+1]=high+1;
            w[high+1]+=2;w[high+2]++;w[high+3]++;
            mp[lie][high+1]=1;mp[lie][high+2]=1;mp[lie][high+3]=1;mp[lie+1][high+1]=1;
        }
    }else if(kuai=='E'){
        if(fangxiang==0||fangxiang==2){
            high=max(h[lie]-1,max(h[lie+1],h[lie+2]));
            h[lie]=high+2;h[lie+1]=high+2;h[lie+2]=high+1;
            w[high+1]+=2;w[high+2]+=2;
            mp[lie][high+2]=1;mp[lie+1][high+1]=1;mp[lie+1][high+2]=1;mp[lie+2][high+1]=1;
        }else{
            high=max(h[lie],h[lie+1]-1);
            h[lie]=high+2;h[lie+1]=high+3;
            w[high+1]++;w[high+2]+=2;w[high+3]++;
            mp[lie][high+1]=1;mp[lie][high+2]=1;mp[lie+1][high+2]=1;mp[lie+1][high+3]=1;
        }
    }else if(kuai=='F'){
        if(fangxiang==0||fangxiang==2){
            high=max(h[lie],max(h[lie+1],h[lie+2]-1));
            h[lie]=high+1;h[lie+1]=high+2;h[lie+2]=high+2;
            w[high+1]+=2;w[high+2]+=2;
            mp[lie][high+1]=1;mp[lie+1][high+1]=1;mp[lie+1][high+2]=1;mp[lie+2][high+2]=1;
        }else{
            high=max(h[lie]-1,h[lie+1]);
            h[lie]=high+3;h[lie+1]=high+2;
            w[high+1]++;w[high+2]+=2;w[high+3]++;
            mp[lie][high+1]=1;mp[lie+1][high+1]=1;mp[lie+1][high+2]=1;mp[lie+2][high+2]=1;
        }
    }else if(kuai=='G'){
        if(fangxiang==0){
            high=max(h[lie],max(h[lie+1],h[lie+2]));
            h[lie]=high+1;h[lie+1]=high+2;h[lie+2]=high+1;
            w[high+1]+=3;w[high+2]++;
            mp[lie][high+1]=1;mp[lie+1][high+1]=1;mp[lie+2][high+1]=1;mp[lie+1][high+2]=1;
        }else if(fangxiang==1){
            high=max(h[lie]-1,h[lie+1]);
            h[lie]=high+2;h[lie+1]=high+3;
            w[high+1]++;w[high+2]+=2;w[high+3]++;
            mp[lie][high+2]=1;mp[lie+1][high+1]=1;mp[lie+1][high+2]=1;mp[lie+1][high+3]=1;
        }else if(fangxiang==2){
            high=max(h[lie]-1,max(h[lie+1],h[lie+2]-1));
            h[lie]=high+2;h[lie+1]=high+2;h[lie+2]=high+2;
            w[high+1]++;w[high+2]+=3;
            mp[lie][high+2]=1;mp[lie+1][high+1]=1;mp[lie+1][high+2]=1;mp[lie+2][high+2]=1;
        }else if(fangxiang==3){
            high=max(h[lie],h[lie+1]-1);
            h[lie]=high+3;h[lie+1]=high+2;
            w[high+1]++;w[high+2]+=2;w[high+3]++;
            mp[lie][high+1]=1;mp[lie][high+2]=1;mp[lie][high+3]=1;mp[lie+1][high+2]=1;
        }
    }
}
int main()
{
    while(scanf("%d %d",&n,&m)!=-1){
        getchar();
        memset(w,0,sizeof(w));memset(h,0,sizeof(h));memset(mp,0,sizeof(mp));ans=0;high=0;
        for(int i=0;i<n;i++){
            luo();
            check();
            //debug();
        }
        cout<<ans<<endl;
    }
    return 0;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值