本题链接:201604-2 俄罗斯方块
本博客给出本题截图:
C++
#include <iostream>
#include <cstring>
using namespace std;
const int N = 20;
int g[N][N], s[N][N];
int p[4][4];
bool draw(int x, int y)
{
memcpy(s, g, sizeof s);
for (int i = 0; i < 4; i ++ )
for (int j = 0; j < 4; j ++ )
if (p[i][j])
{
int a = x + i, b = y + j;
s[a][b] ++ ;
if (s[a][b] == 2) return true;
}
return false;
}
int main()
{
for (int i = 0; i < 15; i ++ )
for (int j = 0; j < 10; j ++ )
cin >> g[i][j];
for (int i = 0; i < 10; i ++ ) g[15][i] = 1;
for (int i = 0; i < 4; i ++ )
for (int j = 0; j < 4; j ++ )
cin >> p[i][j];
int c;
cin >> c;
c -- ;
for (int i = 0; ; i ++ )
if (draw(i, c))
{
draw(i - 1, c);
break;
}
for (int i = 0; i < 15; i ++ )
{
for (int j = 0; j < 10; j ++ )
cout << s[i][j] << ' ';
cout << endl;
}
return 0;
}
总结
我们在判断是否出现重叠的时候,可以用直接累加的方法,如果一个格子上有方块,那么根据题意这个格子显然是 1
,如果发生了重叠,那么显然说明这个格子上是有 2
个方块的,那么一旦出现了 2
个方块的格子,就说明在这一时刻发生了重叠,那么在上一时刻就是恰好没有发生重叠的时刻(即我们的目标所求时刻),故我们只需要输出上一时刻的图形即可,对于特殊的边界处理:没有发生重叠,直接落到了最后一行,我们可以自动在最后一行上补充一行(这行其实是不存在的),并把这行全部赋值为 1
,那么显然会有接触到最后一行时,继续往下走,即会与我们自行添加的一行发生重叠,按照我们之前的思路同样为上一时刻为所求目标时刻