原题:清华大学出题(侵删)
题意:
模拟俄罗斯方块游戏给出 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;
}
本文介绍了一种模拟俄罗斯方块游戏的方法,通过设定方块类型、方向和初始位置,实现方块落下并统计可消除层数的过程。文章提供了一段C++代码示例,详细展示了如何进行模拟。
567

被折叠的 条评论
为什么被折叠?



