链接:http://118.190.20.162/view.page?gpid=T41
思路:有点坑的大模拟,模拟俄罗斯方块下落的过程,从上到下依次拿小矩形最左边的点去枚举判断,找到当前行可以下落的最低位置后输出
代码:
#include<bits/stdc++.h>
using namespace std;
int a[50][50];
int b[50][50];
bool check(int x,int y){
for(int l=1;l<=4;l++)
for(int r=1;r<=4;r++){
if(a[x+l-1][y+r-1]+b[l][r]>=2)return false;
}
return true;
}
int main (){
for(int i=1;i<=15;i++)
for(int j=1;j<=10;j++)
cin>>a[i][j];
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
cin>>b[i][j];
int y;cin>>y;
int num=0;
for(int i=4;i>=1;i--){
int ans=0;
for(int j=1;j<=4;j++){
ans+=b[i][j];
}
if(ans!=0)break;
else num++;
}
num+=12;
int atm=0;
for(int i=0;i<=num;i++){
if(check(i,y)){
atm=i;
}
else break;
}
for(int l=1;l<=4;l++)
for(int r=1;r<=4;r++){
a[atm+l-1][y+r-1]+=b[l][r];
}
for(int i=1;i<=15;i++){
for(int j=1;j<=10;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
/*
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
1 1 1 0 0 0 1 1 1 1
0 0 0 0 1 0 0 0 0 0
0 0 0 0
0 1 1 1
0 0 0 1
0 0 0 0
1
*/