DFS
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> using namespace std; bool map[6][6],flag=0; int dir[5][2]={{0,0},{0,1},{1,0},{-1,0},{0,-1}}; int step; void flip(int row,int col) { for(int i=0;i<5;i++) { int x=row+dir[i][0]; int y=col+dir[i][1]; map[x][y]=!map[x][y]; } } bool check() { int i,j; for(i=1;i<=4;i++) { for(j=1;j<=4;j++) { if(map[i][j]!=map[1][1]) return 0; } } return 1; } void dfs(int row,int col ,int dep) { if(dep==step) { flag = check(); return ; } if(flag||row==5) return ; flip(row,col); if(col<4) dfs(row,col+1,dep+1); else dfs(row+1,1,dep+1); flip(row,col); if(col<4) dfs(row,col+1,dep); else dfs(row+1,1,dep); } int main() { char c; for(int i=1;i<=4;i++) { for(int j=1;j<=4;j++) { cin>>c; if(c=='b')map[i][j]=1; else map[i][j]=0; } } for(step=0;step<=16;step++) { dfs(1,1,0); if(flag)break; } if(flag)cout<<step<<endl; else cout<<"Impossible"<<endl; return 0; }