CF74E 题解
题目类型
很妙的构造题,要写出较优的解也会考验一些码量。
解法
对于下文中的坐标 $(i,j)$,$i$ 表示行,$j$ 表示列。
我们考虑对一个固定的位置 $(i,j)$ 进行如下操作:上右下左上。
会发现 $(i,j)$ 位置上的字符和 $(i,j+1)$ 上的交换了,同时 $j$ 这一列的其它字符也进行了向上的循环位移。
所以我们只要做 $n-1$ 次,就可以把这一列的其它元素归回原位,并且 $(i,j)$ 上的字符还和 $(i,j+1)$ 上的交换了位置($n-1$ 是奇数)。这需要花费 $5n-5$ 次循环位移。
这是左右交换的,上下交换也类似。故而我们得到了交换任意相邻元素的方案。
这时只需要像冒泡排序一样,通过交换相邻的使得最终元素一个个去到该去的位置。
我的代码采用的是逐行还原,能通过。code。
优化解法 $1$
我们没有必要进行 $n-1$ 次,因为我们进行移位的时候可能会破坏其他行已经归位的元素的位置,所以我们每移动一次,就把破坏掉的那个再进行循环移位复原一下即可。
优化解法 $2$
让前 $n-1$ 行的先去到最终位置(交换元素过程中的“上右下左上”只进行 $1$ 次,不是 $n-1$ 次),最后一行通过上述解法中的方法交换得到最终棋盘。
实现相对复杂。