思路:
枚举小方块放到画布的行数并找到小方块放到画布最后一行的行数,即为发生矛盾行数的上一行。
当将小方块放到画步,如果最小单位小方块重叠,则矛盾
#include<iostream>
using namespace std;
int GG[15][10];
int gg[4][4];
int begin_y;
int x;
int get(int cnt,int x)
{
for(int G_x=cnt,g_x=x;g_x>=0;G_x--,g_x--)
{
for(int G_y=begin_y,g_y=0;G_y<=begin_y+3;G_y++,g_y++)
{
if(GG[G_x][G_y]==1 && gg[g_x][g_y]==1)
{
return 1;
}
}
}
return 0;
}
int main()
{
for(int i=0;i<15;i++)
for(int j=0;j<10;j++)
{
scanf("%d",&GG[i][j]);
}
for(int j=0;j<10;j++) //加一层
GG[15][j]=1;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
scanf("%d",&gg[i][j]);
cin>>begin_y;
begin_y--; //矩阵存储下标从0开始
int cnt=3;
for(int i=3;i>=0;i--) //找个4x4方格中俄罗斯方块占据的最后一行
{
int ok=1;
for(int j=0;j<4;j++)
{
if(gg[i][j]==1)
{
x=i;
ok=0;
break;
}
}
if(!ok)
break;
}
while(!get(cnt,x) && cnt<=15)
{
cnt++;
}
cnt--; //发生矛盾的上一行
for(int G_x=cnt,g_x=x;g_x>=0;G_x--,g_x--)
{
for(int G_y=begin_y,g_y=0;G_y<=begin_y+3;G_y++,g_y++)
{
if(GG[G_x][G_y]==0 && gg[g_x][g_y]==1)
{
GG[G_x][G_y]=1;
}
}
}
for(int i=0;i<15;i++)
{
for(int j=0;j<10;j++)
{
printf("%d ",GG[i][j]);
}
printf("\n");
}
return 0;
}