关于俄罗斯方块程序对战程序中实现方块转弯的算法描述。
为了方便描述算法的原理,以方块的左上角为基准,简化问题为一个1*1的小方块,在row*col的矩阵中可以最终移动到哪个位置。
现在来看看位置(x y)是否可以移动到(即使是临时的)。
如果它可以被移动到,那么它从哪个位置移动过来。也很简单。
首先,如果上面位置(x-1 y)可以被移动到,那么(x y)也是可以的。
其次,如果左边(x y-1)或右边(x y+1)的位置可以被移动到,那么(x y)也是可以的。
那么评估位置是否可以移动到(即使是临时的)的算法,就可以这么描述:
1.定义一个二维数组,表示某个格是否移动到(即使是临时的),默认为false不可以。
2.初始化第一行的状态,如果方块在(0 i)可放置(和当前矩阵没冲突)则设置state[0][i]为true。
3.从第二行开始遍历,针对每一行i进行以下处理
3.1.对当前行的列j进行遍历,如果当前位置可放置,且同一列上一行的位置可移动到,则state[i][j]为true
3.2.对当前行的列j进行遍历,如果当前位置state[i][j]为true,则往左边(右边)一直检查
3.3.如果左边位置k可放置,则state[