Multi-University 2015 #7 F(hdu 5374 Tetris)

本文介绍了一款俄罗斯方块游戏的模拟实现方法,包括如何处理不同形状方块的旋转、移动及消除行计分等核心逻辑。文章详细解释了使用C++编程语言进行模拟的具体步骤,并分享了一些实用的编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

题目大意

俄罗斯方块。
有三种块,每种块都可以旋转:
第一种块
第二种块
第三种块
有四种操作,可以将当前块左移(a),右移(d),旋转(w),下降(d)。
其实还有一种操作p,表示不动。
块会自然下降。
每个块的特殊块(绿点)开始时在(4,9)
如果当前操作不合法,那么忽略。
如果一排被填满了,那么删掉这行,上面的行就会掉下来,分数++。
求最终的分数。

题解

好久没做模拟题了~~
首先要对每种块的每个状态打表,以特殊块为(0,0),记录每个位置的被占据情况。
再写个函数叫check,用来判断当前这种块以当前的状态,是不是和图冲突。
如果这个块再向下降就不合法了,那么就停住,写个函数叫set_down,把这个块放在图中。
最后一个函数叫做clear,就是把一行满的删掉。这里有一个小技巧,从题解中学到的,就是只有碰到一行不是满的,就把它从头加入,最后把除了这几行之外的全memset成0就可以了。
还有一个有意思的技巧,就是在switch-case语句中,为什么可以写这种条件语句呢?

switch(oper[i]){
    case 'w':
        check(kind[m],(t+1)%tot[kind[m]],x,y)&&(t=(t+1)%tot[kind[m]]);
    break;
    case 'a':
        check(kind[m],t,x,y-1)&&y--;
    break;
    case 's':
        check(kind[m],t,x-1,y)&&x--;
    break;
    case 'd':
        check(kind[m],t,x,y+1)&&y++;
    break;
}

这是因为&&具有断路性(不知道是不是这个词),就是某一个条件不满足时,后面的语句都不会执行,于是如果check不通过,右面的++,–就不会执行。

#include<cstdio>
#include<cstring>
bool vis[4][4][4][4];//类型,特殊块周围的被占据情况 
int tot[]={1,2,4},kind[1005],ans=0;
bool mp[20][20];
char oper[1005];
bool check(int k,int t,int x,int y){
    if(x>12||x<1||y>9||y<1) return false;
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
            if((mp[x+i][y+j]||x+i>12||y+j>9)&&vis[k][t][i][j]) return false;
    return true;
}
void set_down(int k,int t,int x,int y){
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            if(x+i>12||y+j>9) continue;
            mp[x+i][y+j]|=vis[k][t][i][j];
        }
    }
}
void print(){
    for(int i=12;i>0;i--){
        for(int j=1;j<=9;j++)
            printf("%d",mp[i][j]);
        puts("");
    }
    puts("");
}
void clear(){
    int tmp=1;
    for(int i=1;i<=12;i++){
        for(int j=1;j<=9;j++){
            if(!mp[i][j]){
                for(int w=1;w<=9;w++)
                    mp[tmp][w]=mp[i][w];
                tmp++;
                break;
            }
            if(j==9) ans++;
        }
    }
    for(int i=tmp;i<=12;i++)
        memset(mp[i],0,sizeof(mp[i]));
}
void work(){
    for(int t=0,m=0,i=0,x=9,y=4;i<strlen(oper);i++){
        switch(oper[i]){
            case 'w':
                check(kind[m],(t+1)%tot[kind[m]],x,y)&&(t=(t+1)%tot[kind[m]]);
            break;
            case 'a':
                check(kind[m],t,x,y-1)&&y--;
            break;
            case 's':
                check(kind[m],t,x-1,y)&&x--;
            break;
            case 'd':
                check(kind[m],t,x,y+1)&&y++;
            break;
        }
        if(!check(kind[m],t,x-1,y)){
            set_down(kind[m],t,x,y);
            clear();
            m++;t=0;x=9;y=4;
        }else x--;
//      print();
//      puts("");
    }
}
void Init(){
    vis[0][0][0][0]=vis[0][0][0][1]=vis[0][0][1][0]=vis[0][0][1][1]=1;

    vis[1][0][0][0]=vis[1][0][1][0]=vis[1][0][2][0]=vis[1][0][3][0]=1;
    vis[1][1][0][0]=vis[1][1][0][1]=vis[1][1][0][2]=vis[1][1][0][3]=1;

    vis[2][0][0][0]=vis[2][0][0][1]=vis[2][0][0][2]=vis[2][0][1][0]=1;
    vis[2][1][0][0]=vis[2][1][1][0]=vis[2][1][2][0]=vis[2][1][2][1]=1;
    vis[2][2][1][0]=vis[2][2][1][1]=vis[2][2][1][2]=vis[2][2][0][2]=1;
    vis[2][3][0][0]=vis[2][3][0][1]=vis[2][3][1][1]=vis[2][3][2][1]=1;
}
int solve(){
    memset(mp,0,sizeof(mp));
    int n;
    scanf("%d",&n);
    scanf("%s",oper);
    ans=0;
    for(int i=0;i<n;i++)
        scanf("%d",&kind[i]);
    work();
    return ans;
}
int main(){
    Init();
    int T;
    scanf("%d",&T);
    for(int i=1;i<=T;i++)
        printf("Case %d: %d\n",i,solve());
    return 0;
}
内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值