题意:给你一个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列的位子。