样例输入:
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 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 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 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
3
样例输出:
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 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 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 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
1 1 1 1 1 1 1 1 1 1
0 0 0 0 1 1 0 0 0 0
思路:关键是确定新加入板块的第一行应该停在初始方格图的第几行。对于每一个不为-1的元素Btemp[i](0≤i<4),更新minRow = min(minRow,Atemp[num+i-1]-Btemp[i]-1),最后得到的minRow即为新加入板块的第一行应该停在初始方格图的行数
#include <bits/stdc++.h>
using namespace std;
int a[15][10],b[4][4];
int main() {
int atmp[10],btmp[4];//atmp记录a中图形上边缘,btmp记录b中图形下边缘
fill(atmp,atmp+10,15);//填充向量
fill(btmp,btmp+4,-1);
for(int i=0;i<15;i++)
for(int j=0;j<10;j++){
cin>>a[i][j];
if(a[i][j]&&atmp[j]>i)
atmp[j]=i;
}
for(int i=0;i<4;i++)
for(int j=0;j<4;j++){
cin>>b[i][j];
if(b[i][j])
btmp[j]=i;
}
int col,min_row=15; cin>>col;
for(int i=0;i<4;i++)//确定b在a中的行数
if(btmp[i]>-1)//b中全0,则不考虑
min_row=min(min_row,atmp[col-1+i]-btmp[i]-1);
for(int i=0;i<4&&i+min_row<15;i++)
for(int j=0;j<4;j++)
if(i+min_row>=0&&b[i][j])
a[i+min_row][col-1+j]=b[i][j];
for(int i=0;i<15;i++){
for(int j=0;j<10;j++)
cout<<a[i][j]<<' ';
cout<<endl;
}
return 0;
}