【枚举】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列的位子。

相关文章
相关标签/搜索