又是一年期末时,虽然写代码的时间又变少了,但是还是要每天认真的写
/*位运算和bfs实现*/
#include <iostream>
#include <fstream>
using namespace std;
//var
int turn[16]={0xC800,0xE400,0x7200,0x3100,0x8C80,0x4E40,0x2720,0x1310,0x08C8,0x04E4,0x0272,0x0131,0x008C,0x004E,0x0027,0x0013};
bool flag[16];
int cur=0;
char b[16];
//function
bool dfs(int t,int n,int index);
int main()
{
int i=0;
while(i<16)
{
cin>>b+i;
i+=4;
}
for(i=0;i<16;i++)
if(b[i]=='b')
cur |=(1<<(15-i));
if(cur!=0x0000&&cur!=0xffff)
{
for(i=1;i<=16;i++)
{
// memset(flag,0,sizeof(flag));
if(dfs(0,i,0))
break;
}
if(i>16)
cout<<"Impossible"<<endl;
else
cout<<i<<endl;
}
else
cout<<0<<endl;
system("pause");
return 0;
}
bool dfs(int t,int n,int index)
{
//t´ú±íµ±Ç°µÄlevel£¬n´ú±íµÄÊÇÐèҪѻ·µÄ³ÉÊ飬index´ú±íµÄÊǵ±Ç°µÄË÷Òý
if(t==n)
{
if(cur==0x0000||cur==0xffff)
return true;
else
return false;
}
else
{
if(16-index<n-t)
return false;
for(int i=index;i<16;i++)
{
//if(flag[i])
// continue;
cur=cur^turn[i];
//flag[i]=1;
if(dfs(t+1,n,i+1))
return true;
cur=cur^turn[i];
//flag[i]=0;
}
return false;
}
}
/*bfs实现加枚举*/
#include <iostream>
using namespace std;
/*252K 110MS*/
//var
char chess[16];
int a[4][4];
int type;
//function
//row´ú±íµÄÐÐÊý£¬col´ú±íµÄÊÇÁÐÊý£¬t´ú±í±éÀúµÄ²ãÊý£¬index´ú±í
bool dfs(int t,int index,int n);
bool check();
void flip(int x,int y);
int main()
{
int i=0;
while(i<16)
{
cin>>chess+i;
i+=4;
}
memset(a,0,sizeof(a));
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
if(chess[4*i+j]=='b')
a[i][j]=1;
}
int num=0;
bool flag=false;
for(int i=0;i<=16;i++)
{
if(dfs(0,0,i))
{
num=i;
flag=true;
break;
}
}
if(flag)
cout<<num<<endl;
else
cout<<"Impossible"<<endl;
system("pause");
return 0;
}
bool dfs(int t,int index,int n)
{
if(t==n)
{
if(check())
return true;
else
return false;
}
else
{
if(16-index<n-t)
return false;
for(int i=index;i<16;i++)
{
flip(i/4,i%4);
if(dfs(t+1,i+1,n))
return true;
flip(i/4,i%4);
}
return false;
}
}
bool check()
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
if(a[i][j]!=a[0][0])
return false;
}
return true;
}
void flip(int x,int y)
{
a[x][y]=(a[x][y]+1)%2;
if(x-1>=0)
a[x-1][y]=(a[x-1][y]+1)%2;
if(y-1>=0)
a[x][y-1]=(a[x][y-1]+1)%2;
if(x+1<4)
a[x+1][y]=(a[x+1][y]+1)%2;
if(y+1<4)
a[x][y+1]=(a[x][y+1]+1)%2;
}