题意:
有两个\(n \times m\)的矩阵\(A,B\),都是由\(1 \times 2\)的砖块铺成,代表初始状态和结束状态
有一种操作可以把两个砖块拼成的
\(2 \times 2\)的矩形旋转
\(90^{\circ}\) 问如何操作才能使初始状态转化为结束状态,无解输出\(-1\)
分析:
不妨假设\(m\)为偶数,否则可以旋转整个矩阵使得矩阵的列数为偶数
先找一个中间过度状态矩阵
\(C\),它的每个砖块都是水平方向的
求出
\(A \to C\)和
\(B \to C\)的操作序列,因为操作是可逆的,所以就得到了
\(A \to C \to B\)的操作序列
从第一行开始逐个扫描,遇到一个竖直方向的砖块就将它旋转,这是可能有两种情况:
- 右边的砖块也是竖直方向的,那么可以直接旋转
- 右边砖块是水平的,那么就递归到子问题:将右边的水平砖块先旋转过来,再一起旋转
算法的正确性不会证=_=
#include #include #include #include