小模拟题,但是写起来挺麻烦,主要是行列转换容易出错
先对齐列,上下寻找0计算可以下落几格,取最小值(要注意如果板块图案这一列没有方块,就不用考虑了,否则可能算错,因为这里90分,找了好久bug)
然后再把板块图案对齐放在指定位置,输出
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=15;
const int M=10;
int a[N+1][M+1],b[4][4],k;
int main()
{
for(int i=0;i<N;i++)
for(int j=0;j<M;j++)
scanf("%d",&a[i][j]);
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
scanf("%d",&b[i][j]);
scanf("%d",&k);
k--;
int down=N;
for(int j=0;j<4;j++) //计算下落几格
{
int t=0,i;
for(i=3;i>=0;i--)
if(!b[i][j]) t++; else break;
if(i<0) continue; //这一列没有方块,不用计算
for(i=4;i<N;i++)
if(!a[i][k+j]) t++; else break;
down=min(down,t);
}
for(int i=0;i<4;i++) //放置方块
{
if(i+down>=N) break;
for(int j=0;j<4;j++)
if(b[i][j]) a[down+i][j+k]=1;
}
for(int i=0;i<N;i++) //输出
{
for(int j=0;j<M-1;j++)
printf("%d ",a[i][j]);
printf("%d\n",a[i][M-1]);
}
return 0;
}