点击前往试题目录:https://blog.csdn.net/best335/article/details/99550556
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int A[18][10],B[4][4],C,f=-1;//A原始画板 B要放的图案 C开始列数 f有效图案行数
memset(A,0,sizeof(A));
for(int i=0;i<15;++i)
for(int j=0;j<10;++j)
cin>>A[i][j];
for(int i=0;i<4;++i)
for(int j=0;j<4;++j)
cin>>B[i][j],f=B[i][j]==1?i:f;
cin>>C,--C,++f;
for(int R=0;R<15;++R){//尝试一行一行放
bool F=true;
for(int i=R,ni=R+4,xi=0;i<ni&&F;++i,++xi)
for(int j=C,nj=C+4,xj=0;j<nj&&F;++j,++xj){
if(A[i][j]==1&&B[xi][xj]==1) F=false;
}
if(!F){//这行就放不下
for(int i=R-1,ni=i+4,xi=0;i<ni;++i,++xi)
for(int j=C,nj=C+4,xj=0;j<nj;++j,++xj)
if(B[xi][xj]==1) A[i][j]=1;
break;
}
else if(R==14){//都能放下就落到底部
for(int i=15-f,xi=0,ni=i+f;i<ni;++i,++xi)
for(int j=C,xj=0,nj=C+4;j<nj;++j,++xj)
if(B[xi][xj]==1)
A[i][j]=1;
}
}
for(int i=0;i<15;++i){
for(int j=0;j<10;++j)
cout<<(j==0?"":" ")<<A[i][j];
cout<<endl;
}
return 0;
}