Multi-University 2015 #7 F(hdu 5374 Tetris)
来源:互联网 发布:数据库论文 编辑:程序博客网 时间:2024/06/15 08:59
题目链接
题目大意
俄罗斯方块。
有三种块,每种块都可以旋转:
有四种操作,可以将当前块左移(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;}
1 0
- Multi-University 2015 #7 F(hdu 5374 Tetris)
- Multi-University 2015 #7 D(hdu 5372 Segment Game)
- HDU 5289 Assignment (2015 Multi-University Training Contest 1)
- hdu 5289 Assignment(2015 Multi-University Training Contest 1)
- HDU 5289 Assignment(2015 Multi-University Training Contest 1)
- HDU 5305 Friends(2015 Multi-University Training Contest 2)
- Multi-University 2015 #6 E(hdu 5357 Easy Sequence)
- HDU 5374 Tetris (2015年多校比赛第7场)
- hdu 3571 Hotaru's problem || 2015 Multi-University Training Contest 7 (manacher算法)
- Multi-University 2015 #7 J(hdu 5378 Leader in Tree Land)
- HDU 5373 The shortest problem(模拟)——2015 Multi-University Training Contest 7
- Hdu 2015 Multi-University Training Contest1
- Hdu 2015 Multi-University Training Contest2
- Hdu 2015 Multi-University Training Contest3
- Hdu 2015 Multi-University Training Contest4
- Hdu 2015 Multi-University Training Contest5
- Hdu 2015 Multi-University Training Contest6
- Hdu 2015 Multi-University Training Contest7
- 134. Gas Station
- iOS 中的 GpuImage 及相关滤镜介绍
- react组件生命周期
- sphinx 源码阅读之 分词,压缩索引,倒排
- iOS block
- Multi-University 2015 #7 F(hdu 5374 Tetris)
- 决策树(ID3,C4.5)Python实现
- 和最接近定值的元组
- Word Ladder II
- RaspberryPi 3B之初体验笔记
- STL vector用法介绍
- Android系统的常用权限
- vmware中使用net方式配置docker静态ip
- 根据Model部署流程