1389. 玩诈欺的小杉【推荐】

Description

  是这样的,在小杉的面前有一个N行M列的棋盘,棋盘上有N*M个有黑白棋的棋子(一面为黑,一面为白),一开始都是白面朝上。
  小杉可以对任意一个格子进行至多一次的操作(最多进行N*M个操作),该操作使得与该格同列的上下各2个格子以及与该格同行的左右各1个格子以及该格子本身翻面。
  例如,对于一个5*5的棋盘,仅对第三行第三列的格子进行该操作,得到如下棋盘(0表示白面向上,1表示黑面向上)。

  00100
  00100
  01110
  00100
  00100

  对一个棋盘进行适当的操作,使得初始棋盘(都是白面朝上)变成已给出的目标棋盘的操作集合称作一个解法。
  小杉的任务是对给出的目标棋盘求出所有解法的总数。

Input

  每组测试数据的第一行有3个正整数,分别是N和M和T(1<=N,M<=20,1<=T<=5)
  接下来T个目标棋盘,每个目标棋盘N行,每行M个整数之前没有空格且非0即1,表示目标棋盘(0表示白面朝上,1表示黑面朝上)
两个目标棋盘之间有一个空行。
  特别地,对于30%的数据,有1<=N,M<=15

Output

  对每组数据输出T行,每行一个整数,表示能使初始棋盘达到目标棋盘的解法总数

Sample Input

4 4 2
0010
0010
0111
0010

0010
0110
0111
0010

Sample Output

1
1

Data Constraint

Hint

【样例解释】
对于输入的数据,两个目标棋盘各有一种解法
1:
0000
0000
0010
0000
2:
1011
1101
0111
1011
其中1表示对该格进行操作,0表示不操作

Solution

把棋盘旋转90度(列看成行,行看成列)。

对于暴力的优化,如果其上一行的同一列上的点为1那么它必须反转,否则必须不能反转。

可以看成枚举完第1行的是否反转的状态之后,下面的状态都是固定的。

时间复杂度O(2^20nm)。

考虑优化,

枚举第0行的状态,表示第1行的某些点是否反转操作(因为第1行已经读入有点,所以不能枚举),然后对于第i-1行状态为1的那些点,在第i行的对应位置(j相同的位置)必须进行操作,即a[ i ]^=a[ i -1 ],为1才会反转,为0则不变。而这只是反转了一个,还有这个点左边两个和右边两个,那么分别^(a[ i-1 ]>>1)^(a[ i-1 ]>>2)^(a[ i-1 ]<<1)^(a[ i-1 ]<<2)即可。同时对于下一行的对应位置也要相应的^a[ i-1 ],这就与题目中的操作相符了。

最后判断a[ m ]是否为0然后加入答案即可。

时间复杂度O(2^20m)。

实质在于只有一种操作,而且数据范围比较大,因此不用轮廓线dp。

Code

#include<cstdio> 
#include<cstring>
#include<algorithm>
#define I int
#define ll long long
#define F(i,a,b) for(i=a;i<=b;i++)
#define N 22
using namespace std;
I n,m,T,x,ans,a[N],b[N];
char c;
void R(I &x){
	x=0;c=getchar();
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
}
I main(){
	freopen("Fraud.in","r",stdin);
	freopen("Fraud.out","w",stdout);
	I i,j;
	R(n),R(m),R(T);
	while(T--){
		memset(a,ans=0,sizeof a);
		F(i,1,n){
			F(j,1,m){
				c=getchar();
				while(c!='0'&&c!='1') c=getchar();
				if(c-'0') a[j]|=(1<<i-1);
			}
		}
		F(a[0],0,(1<<n)-1){
			F(i,0,m) b[i]=a[i];
			F(i,1,m){
				b[i]=(b[i]^b[i-1]^(b[i-1]>>1)^(b[i-1]>>2)^(b[i-1]<<1)^(b[i-1]<<2))&((1<<n)-1);
				b[i+1]^=b[i-1];
			}
			ans+=!b[m];
		}
		printf("%d\n",ans);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zsjzliziyang/article/details/107921936
今日推荐