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

相關文章
相關標籤/搜索