记录编号 293422 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2010冲刺七]翻转游戏 最终得分 100
用户昵称 Gravatar森林 是否通过 通过
代码语言 C++ 运行时间 0.005 s
提交时间 2016-08-10 17:08:30 内存使用 0.32 MiB
显示代码纯文本
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<stdlib.h>
#include<string.h>
#define WJ(name) freopen(#name".in","r",stdin);freopen(#name".out","w",stdout);
#define JW fclose(stdin);fclose(stdout);
#define maxn 3300000
using namespace std;
const int dig[]={32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1},inf=0x7f7f7f7f;
int c=0,tmp;
inline void change(int& tmp,int i,int j){
	tmp^=dig[4*(i-1)+j-1];
	if(i!=1)tmp^=dig[4*(i-2)+j-1];
	if(i!=4)tmp^=dig[4*i+j-1];
	if(j!=1)tmp^=dig[4*(i-1)+j-2];
	if(j!=4)tmp^=dig[4*(i-1)+j];
}
inline int Work2(bool a,bool w){
	int ret=0;
	if(w)tmp=c;
	for(int j=2;j<=4;j++)
		for(int i=1;i<=4;i++)
			if(((tmp>>(24-4*j-i))&1)!=a)
				change(tmp,j,i),ret++;
	if(tmp!=65535&&tmp)return inf;
	return ret;
}
inline int Work1(bool a){
	int ret=0,ans=inf;
	for(int i=1;i<=4;i++){
		tmp=c,ret=0;
		change(tmp,1,i);ret++,ret+=Work2(a,0);
		ans=min(ans,ret);
	}
	for(int i=1;i<4;i++)
		for(int j=i+1;j<=4;j++){
			tmp=c,ret=0;
			change(tmp,1,i),change(tmp,1,j);ret+=2,ret+=Work2(a,0);
			ans=min(ans,ret);
		}
	for(int i=1;i<3;i++)
		for(int j=i+1;j<4;j++)
			for(int k=j+1;k<5;k++){
				tmp=c,ret=0;
				change(tmp,1,1),change(tmp,1,2),change(tmp,1,4);ret+=3,ret+=Work2(a,0);
				ans=min(ans,ret);
			}
	tmp=c,ret=0;
	change(tmp,1,1),change(tmp,1,2),change(tmp,1,3),change(tmp,1,4);ret+=4,ret+=Work2(a,0);
	ans=min(ans,ret);
	return ans;
}
int main(){
	WJ(flip);
	char ch,k=15;
	for(int i=1;i<=4;i++)
		for(int j=1;j<=4;j++){
			cin>>ch;
			if(ch=='w')c+=1<<k;
			k--;
		}
	if(!c||c==65535){
		puts("0");
		JW;
		return 0;
	}
	int asn=min(min(min(Work1(1),Work1(0)),Work2(1,1)),Work2(0,1));
	if(asn>=inf)puts("Impossible");
	else printf("%d\n",asn);
	JW;
	return 0;
}