读完题目最初的想法是使用for循环
模拟方块下落,
在此之前,要对方块数据进行处理:最下方全0行清除掉
在下落到当前行时判断是否有方块(即当前格子的数据为1),然后预判方块会不会发生碰撞,以及何时碰撞(再下落几格会碰撞)。或者不会发生碰撞,直接下落到底。
实现起来比较复杂,能通过大部分样例(90分)
但是有一部分样例是无法通过的,他们的共性就是在同一行中,从左至右,如果左边首先预判会在下落两个后发生碰撞,就会结束判断,然后宣布找到碰撞值并开始合并。哪怕右边在此时已经发生了碰撞,也会被忽略掉。
具体的出问题例程:
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 1 0 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1
0 0 1 1
0 0 0 1
0 0 0 1
0 0 0 0
1
正确输出应该是:
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 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 1 1 1 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1
在研究了满分算法后,得到启发:
标准方块固定为4个,可以先将4个方块的坐标值存储起来,然后模拟下落,每一行只判断四个方块是否会发生碰撞,依然是只要出现一个发生碰撞,就宣布找到落点,并且合并数据(区别是不进行预判是否将要碰撞)。