1. 程式人生 > 實用技巧 >玩詐欺的小杉

玩詐欺的小杉

題目

解題思路

對一個點進行操作,他只對左右各一列,上下兩列有影響。
又因為操作順序對結果沒有影響(顯然)
所以我們可以一列一列搜
可以發現,上一列的狀態是完全影響這一列的狀態的
再用異或來優化
時間複雜度\(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);
	}
}