【枚举】AtCoder Regular Contest 095 C - Symmetric Grid
题意:给你一个H*W的字符矩阵,一次操作可以任意将两行或者两列交换。问你是否能通过任意多次操作,使得其变为对称矩阵。对称的含义是:对于任何格子A(i,j),其都等于A(H-i+1,W-j+1)。
显然,先换行还是列不影响结果,不妨假设先换行再换列。
行不必真换,只需找出哪些行成对即可,然后这些对的顺序无关,这样的方案数只有1*3*5*7*...*n,只有10000左右。
这个怎么枚举呢,假设行数是1,2,3,4,5,6,
那么就(1,2)-(3,4)-(5,6)
-(3,5)-(4,6)
-(3,6)-(4,5)
(1,3)-(2,4)-(5,6)
-(2,5)-(4,6)
-(2,6)-(4,5)
(1,4)-(2,3)-(5,6)
-(2,5)-(3,6)
-(2,6)-(3,5)
(1,5)-(2,3)-(4,6)
-(2,4)-(3,6)
-(2,6)-(3,4)
(1,6)-(2,3)-(4,5)
-(2,4)-(3,5)
-(2,5)-(3,4)
就每次枚举一对后,下一对(x,y)的x一定选上次空出来的第一个位子,y去枚举其他位子即可。
行数如果是奇数 类似,最后会剩下一个。
这样枚举完行,再去check列,假设列数为偶数,则每次对于一列,找是否有与其的逆序相等的列,如果有 则配对成功。最后看看是否都能配对成功。
如果列数是奇数,还必须有一列单独的回文列放在(W+1)/2列的位子。
——The Solution By AutSky_JadeK From UESTC
转载请注明出处:http://www.cnblogs.com/autsky-jadek/