题意为有一个4*4的棋盘棋子为黑或白,可以任意选择一个点将这个点和上下左右变为相反的颜色,问最少的操作次数可以将棋盘中的棋子是一个颜色。
思路 可以发现对于一个点,要不选择一次,要不一次也不选择,选两次可以发现和不选择是一个效果,选择3次和一次也是一个效果,自然可以想到二进制枚举每种情况,选择最小值即可。
#include<iostream>
using namespace std;
char a[5][5],b[5][5];
int dx[5]={0,0,1,0,-1},dy[5]={0,1,0,-1,0},ans=20;
void init()
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
b[i][j]=a[i][j];
return;
}
int main()
{
for(int i=0;i<4;i++)
cin>>a[i];
for(int i=0;i<1<<16;i++)
{
int f=0;
init();
for(int j=0;j<16;j++)
{
if(i>>j&1)
{
f++;
int hang=j/4;
int lie=j-hang*4;
for(int k=0;k<5;k++)
{
if(hang+dx[k]>=0&&hang+dx[k]<4&&lie+dy[k]>=0&&lie+dy[k]<4)
{
if(b[hang+dx[k]][lie+dy[k]]=='b')b[hang+dx[k]][lie+dy[k]]='w';
else b[hang+dx[k]][lie+dy[k]]='b';
}
}
}
}
int numb=0,numw=0;
for(int j=0;j<4;j++)
for(int k=0;k<4;k++)
if(b[j][k]=='b')numb++;
else numw++;
if(numb==16||numw==16)
ans=min(ans,f);
}
if(ans!=20)
cout<<ans<<endl;
else cout<<"Impossible"<<endl;
}
京公网安备 11010502036488号