题意为有一个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; }