AGC006E Rotate 3x3
题意:有一个
每次操作可以将一个
给出矩阵的目标状态,判定是否能通过若干次上述操作达到。
- 性质:每一列的三个数是不会分开的,但可能上下翻转。
于是,将三个数映射成一个数,且有正负之分,问题转化为 :
给出长为
若
- 性质:操作不能改变某个数所在位置的奇偶性。
若一个数的起点和终点位置奇偶性不同,则无解。
- 性质:操作是可逆的,且逆操作为操作本身。
可以把问题转化为由
先不考虑正负,问题相当于利用交换
按照奇偶分为两个序列,分别冒泡排序即可。
计算出排好序后的正负,再尝试将全部负数修正为正数。
先考虑排好序后如何调整。
若奇位置或者偶位置的负数为奇数个,则必定无解。
因为奇位置和偶位置是已经有序的,要想结束时仍然有序,一定只能进行偶数次交换,故不可能影响奇数次正负性。
先消去所有在奇数位置的负数。
将负数两两配对,假设为
运送
而对
故有解的充要条件是,奇位置或者偶位置的负数为偶数个。
对奇位置的交换操作会影响两个奇位置和一个偶位置,对奇位置的负数个数奇偶性无影响,而对偶位置的负数个数奇偶性有影响。
于是,计算出两者的逆序对数目(即为交换次数)即可,复杂度为