#include <stdio.h>
int main()
{
int a[15][10] = {0};
for(int i = 0; i < 15; i++)
for(int j = 0; j < 10; j++)
scanf("%d", &a[i][j]);
int b[4][4] = {0}, temp1[4] = {0}, temp2[4] = {0};
for(int i = 0; i < 4; i++)
for(int j = 0; j < 4; j++)
scanf("%d", &b[i][j]);
int shangbian = 0, xiabian = 3, sum = 0;
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 4; j++)
sum += b[i][j];
if(sum == 0)
shangbian++;
else if(sum != 0)
break;
}
sum = 0;
for(int i = 3; i >= 0; i--)
{
for(int j = 0; j < 4; j++)
sum += b[i][j];
if(sum == 0)
xiabian--;
else if(sum != 0)
break;
}
// printf("%d %d", shangbian, xiabian);至此得到了板块中方块的上边界和下边界;
int n, begin, flag = 0, bkgd;
scanf("%d", &n);
begin = n - 1;//begin表示板块在数组a中的起始列数;
bkgd = xiabian - shangbian + 1;//板块高度;
for(int hang = 4; hang < 15; hang++)//hang表示板块下面的第一行;
{
for(int i = 0; i < 4; i++)
{
temp1[i] = a[hang][i + begin] + b[xiabian][i];
temp2[i] = a[hang - 1][i + begin] + b[xiabian - 1][i];
// printf("%d ",temp[i]);
}
/*
这里引入数组temp2是为了避免类似于 1 1 1 1
1 0 0 1
1 0 0 1
1 0 0 1导致的错误;
*/
//printf("\n");
for(int i = 0; i < 4; i++)
if(temp1[i] == 2 || (temp1[i] != 2 && temp2[i] == 2))
{
flag = 1;
break;
}//flag为1表示板块与其下面一行有冲突,无法落下;
if(flag == 0 && hang == 14)
{
for(int p = hang; p > hang - bkgd; p--)
{
for(int q = 0; q < 4; q++)
a[p][q + begin] += b[xiabian][q];//若板块落到了最后一行,则
//将板块就地放入数组a中;
xiabian--;
}
break;
}
else if(flag == 1)
{
for(int p = hang - 1; p > hang - bkgd - 1; p--)
{
for(int q = 0; q < 4; q++)
a[p][q + begin] += b[xiabian][q];//若板块不能继续下落,则
//将板块就地放入数组a中;
xiabian--;
}
break;
}
}
for(int i = 0; i < 15; i++)
{
for(int j = 0; j < 10; j++)
printf("%d ", a[i][j]);
printf("\n");
}
return 0;
}
CCF认证 - 201604-2 - 俄罗斯方块 C语言代码实现 (90分)
最新推荐文章于 2023-06-15 16:45:17 发布