玩詐欺的小杉
阿新 • • 發佈:2020-08-10
題目
解題思路
對一個點進行操作,他只對左右各一列,上下兩列有影響。
又因為操作順序對結果沒有影響(顯然)
所以我們可以一列一列搜
可以發現,上一列的狀態是完全影響這一列的狀態的
再用異或來優化
時間複雜度\(O(MT2^n)\)
Code
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int t,n,m,y[25],x[25]; int main() { scanf("%d%d%d",&n,&m,&t); while (t--) { memset(x,0,sizeof(x)); for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { int q; scanf("%1d",&q); if (q) x[j] |= (1 << i - 1); } int ans = 0; for (int i = 0; i <= (1 << n) - 1; i++) { y[0] = i; for (int j = 1; j <= m; j++) y[j] = x[j]; for (int j = 1; j <= m; j++) { y[j] = y[j] ^ y[j - 1]; y[j] = y[j] ^ (y[j - 1] >> 1); y[j] = y[j] ^ (y[j - 1] >> 2); y[j] = y[j] ^ (y[j - 1] << 1); y[j] = y[j] ^ (y[j - 1] << 2); y[j] = y[j] & ((1 << n) - 1); y[j + 1] = (y[j + 1] ^ y[j - 1]) & ((1 << n) - 1); } if (y[m] == 0) ans++; } printf("%d\n",ans); } }