POJ 1753

来源:互联网 发布:网络语言单词词缀 编辑:程序博客网 时间:2024/05/18 00:05

题意  最少需要变几步能让所有格子都是黑色或者白色,当一个格子变化时它的上下左右都会变化

只有16个格子 直接暴搜 

每个格子最多变一次 变两次的效果相当于不变 先变后变没影响

#include<cstdio>using namespace std;#define MAX 90000000#define M 10#define TO 16const int B=0,W=1;int ans;int n[M];char temp[M][M];int a[M][M];int nx[]={0,1,0,0,-1};int ny[]={0,0,1,-1,0};void read(){int i,j;n[B]=n[W]=0;for(i=0;i<4;i++){scanf("%s",temp[i]);for(j=0;j<4;j++){if(temp[i][j]=='b'){a[i][j]=B;n[B]++;}else{a[i][j]=W;n[W]++;}}}}void add(int i,int j){int k;for(k=0;k<5;k++){    int x=i+nx[k];    int y=j+ny[k];if(x>=0&&x<4&&y>=0&&y<4){n[a[x][y]]--;a[x][y]=1-a[x][y];n[a[x][y]]++;}}}void fun(int num,int total){if(num==16){if(n[B]==16||n[W]==16){if(total<ans){ans=total;}}return ;}fun(num+1,total);add(num/4,num%4);fun(num+1,total+1);add(num/4,num%4);}int main(){read();ans=MAX;fun(0,0);if(ans<MAX){printf("%d\n",ans);}else{printf("Impossible\n");}return 0;}

原创粉丝点击