分类:
枚举
大意:
给定一个4*4的黑白棋盘,每次可以将一个棋子反转颜色,同时这个棋子的上下左右都会反转,问你最少反转几次,可以将整个棋盘变成同色的
时空限制:
1000ms/65536kB
输入格式:
共4行,每行4个字符,若是b表示是黑,w表示是白
输出格式:
1行,1个数字表示最少需要反转几次,若是无法完成,输出1行’Impossible’(不带引号)
数据范围:
无
一遍dfs,枚举每个点要不要选,时间复杂度O(216)
代码中把数组的0和n+1列空出来这样反转的修改就方便很多
#include<iostream>
#include<cstdio>
using namespace std;
char c;
bool a[6][6];
int Min=17;
void turn(int x,int y){
a[x][y]=!a[x][y];
a[x+1][y]=!a[x+1][y];
a[x-1][y]=!a[x-1][y];
a[x][y+1]=!a[x][y+1];
a[x][y-1]=!a[x][y-1];
}
void dfs(int x,int y,int step){
bool flag=0;
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
if(a[i][j]!=a[1][1]){
flag=1;
break;
}
}
if(flag==1) break;
}
if(flag==0){
Min=min(Min,step);
return;
}
if(y>4) return;
int X=x,Y=y;
x++;
if(x==5){
x=1;
y++;
}
dfs(x,y,step);
turn(X,Y);
dfs(x,y,step+1);
turn(X,Y);
}
signed main(){
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++){
cin>>c;
if(c=='b') a[i][j]=1;
}
dfs(1,1,0);
if(Min==17){
printf("Impossible\n");
return 0;
}
printf("%d\n",Min);
return 0;
}