思路:
1.用数组存储原来的方格和即将落下的方格;
2.从下往上搜原来的方格的底边(即最下面的、开始有1的行);
3.然后一层一层模拟下降,正在落下的方格和目前方格对应的界面上的4*4区域里,不能有重叠即可;
代码:
#include<bits/stdc++.h>
using namespace std;
#define rp(i,n) for(int i=0;i<n;i++)
int table[15][10];
int mat[4][4];
int main(){
rp(i,15) rp(j,10) cin>>table[i][j];
rp(i,4) rp(j,4) cin>>mat[i][j];
int left;
cin>>left;
left--;
int but;//新方格最下方有方块的位置;
for(but=3;but>=0;but--){
rp(i,4) if(mat[but][i]) goto out1;
}out1:;
int i;
for(i=but;i<=14;i++){
rp(j,but+1) rp(k,4){//table[i-j][left+k]和mat[but-j][k]不都为1即可
if(table[i-j][left+k]&&mat[but-j][k]) goto out2;
}
}out2:i--;
rp(j,but+1) rp(k,4){
if(mat[but-j][k]) table[i-j][left+k]=1;
}
rp(i,15){
cout<<table[i][0];
for(int j=1;j<10;j++) cout<<' '<<table[i][j];
putchar('
');
}
return 0;
}