这题和1753差不多,多了一个数位压缩状态,记录翻了的点
#include<iostream>
#include <string>
#include<vector>
#include<algorithm>
#include<set>
#include<cmath>
using namespace std;
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define sqr(i) ((i)*(i))
#define pii pair<int,int>
#define mp make_pair
#define FOR(i,b,e) for(int i=b;i<=e;i++)
#define ms(a) memset(a,0,sizeof(a))
const int maxnum = 10005;
int mat[4][4];
bool vis[4][4];
void flip(int x,int y){
mat[x][y]=1-mat[x][y];
FOR(i,0,3) mat[i][y]=1-mat[i][y];
FOR(i,0,3) mat[x][i]=1-mat[x][i];
/*printf("\n");
FOR(i,0,3){
FOR(j,0,3){
printf("%d",mat[i][j]);
}
printf("\n");
}*/
}
bool check(){
int sum=0;
FOR(i,0,3){
FOR(j,0,3){
sum+=mat[i][j];
}
}
if (sum==16)
{
return true;
}
return false;
}
int mintime=100, mindp=0;
void enumM(int n,int times ,int dp){
if(n==16)return;
enumM(n+1,times,dp);
flip(n/4,n%4);
if(check()){
mintime=min(mintime,times);
mindp = dp|(1<<n);
}
enumM(n+1,times+1,dp|(1<<n));
flip(n/4,n%4);
}
int main()
{
char ch;
FOR(i,0,3){
FOR(j,0,3){
scanf("%c",&ch);
if(ch=='+')mat[i][j]=0;
else mat[i][j]=1;
}scanf("%c",&ch);
}
ms(vis);
if(check()) printf("0\n");
else{
enumM(0,1,0);
if(mintime>16)printf("Impossible\n");
else printf("%d\n",mintime);
int tmp,val;
while(mindp){
val=0;
tmp = mindp & (-mindp);
mindp -=tmp;
while(tmp){
val++;
tmp =tmp>>1;
};
val--;
printf("%d %d\n",val/4+1,val%4+1);
}
}
}