玩诈欺的小杉

题目

解题思路

对一个点进行操作,他只对左右各一列,上下两列有影响。
又因为操作顺序对结果没有影响(显然)
所以我们可以一列一列搜
可以发现,上一列的状态是完全影响这一列的状态的
再用异或来优化
时间复杂度(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);
	}
}
原文地址:https://www.cnblogs.com/nibabadeboke/p/13472145.html