记录编号 |
293422 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[NOIP 2010冲刺七]翻转游戏 |
最终得分 |
100 |
用户昵称 |
森林 |
是否通过 |
通过 |
代码语言 |
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;
}