记录编号 178293 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2010冲刺七]翻转游戏 最终得分 100
用户昵称 Gravatar真红之蝶 是否通过 通过
代码语言 C++ 运行时间 0.410 s
提交时间 2015-08-13 16:43:59 内存使用 0.35 MiB
显示代码纯文本
#include<cstdio>
using namespace std;
char a[6][6];
int b[6][6],ans=0x7fffffff,tot1,tot2,dig[16]={32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1},kmp=0;
int flag[6][6];int v[6][6][6][6][17];
int minc(int a,int b)
{
	return (a<b)?a:b;
}
void dfs(int x,int y,int step,int dx,int dy)
{
    if(v[x][y][dx][dy][step]>32)
        return;
    v[x][y][dx][dy][step]++;
	int c=0,d=0;
	flag[x][y]=1;
	b[x][y]^=1;
	b[x-1][y]^=1;
	b[x+1][y]^=1;
	b[x][y-1]^=1;
	b[x][y+1]^=1;
	for(int i=1;i<=4;++i)
	    for(int j=1;j<=4;++j)
	        c=(b[i][j])?++c:c,d=(!b[i][j])?++d:d;
	if(c==16||d==16)
	{
	    ans=minc(ans,step);
	    flag[x][y]=0;
	    b[x][y]^=1;
     	b[x-1][y]^=1;
	    b[x+1][y]^=1;
    	b[x][y-1]^=1;
    	b[x][y+1]^=1;
    	return;
    } 
    for(int i=1;i<=4;++i)
        for(int j=1;j<=4;++j)
            if(!flag[i][j])
               dfs(i,j,step+1,x,y);
    flag[x][y]=0;
	b[x][y]^=1;
    b[x-1][y]^=1;
	b[x+1][y]^=1;
    b[x][y-1]^=1;
    b[x][y+1]^=1;
    return;
}
/*void bfs(int x,int step)
{
    if(x==0||x==((1<<16)-1))
    {
        ans=minc(ans,step);
    }
}*/
int main()
{
    freopen("flip.in","r",stdin);
    freopen("flip.out","w",stdout);
	for(int i=1;i<=4;++i)
	    scanf("%s",&a[i][1]);
	for(int i=1;i<=4;++i)
	    for(int j=1;j<=4;++j)
	        b[i][j]=(a[i][j]=='b')?0:1;
	for(int i=1;i<=4;++i)
	    for(int j=1;j<=4;++j)
	    {
	        tot1=(b[i][j])?++tot1:tot1;
	        tot2=(!b[i][j])?++tot2:tot2;
	    }
	if(tot1==16||tot2==16)
	{
		printf("0");
		getchar();getchar();getchar();getchar();
		return 0;
	}
	
	for(int i=1;i<=4;++i)
	    for(int j=1;j<=4;++j)
	        dfs(i,j,1,0,0);
/*	for(int i=1;i<=4;++i)
	    for(int j=1;j<=4;++j)
        {
            if(b[i][j])
                kmp+=(1<<(4*(i-1)+j));
        }*/
   /* bfs(kmp,0);*/
   if(ans==0x7fffffff)
       printf("Impossible");
    else
       printf("%d",ans);
	getchar();getchar();getchar();getchar();
    return 0;
}