题目
解题思路
对一个点进行操作,他只对左右各一列,上下两列有影响。
又因为操作顺序对结果没有影响(显然)
所以我们可以一列一列搜
可以发现,上一列的状态是完全影响这一列的状态的
再用异或来优化
时间复杂度(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
",ans);
}
}