模拟水题,4*4的格子,每个格子可能发生的情况有两种,用枚举的方法共有2^16种可能的情况
故有如下代码:
#include<iostream>
using namespace std; bool map[4][4]; int min_step=10000; void init() { for (int i=0;i<4;i++) for (int j=0;j<4;j++) { char c; cin>>c; if (c=='b') map[i][j]=true; else map[i][j]=false; } } void turn (int x,int y) { if (x>=0&&x<=3&&y>=0&&y<=3) map[x][y] = !map[x][y]; return; } void change_color(int num) { int i=num/4; int j=num%4; turn(i,j); turn(i+1,j); turn(i-1,j); turn(i,j+1); turn(i,j-1); } bool Judge() { int sum=0; for (int i=0;i<4;i++) for (int j=0;j<4;j++) sum+=map[i][j]; if (sum%16) return false; else return true; } void backTrack(int num,int step) { if (Judge()) if (min_step>step) { min_step=step; return; } if (num>=16) return; backTrack(num+1,step); change_color(num); backTrack(num+1,step+1); change_color(num); } int main() { init(); backTrack(0,0); if (min_step==10000) cout<<"Impossible"<<endl; else cout<<min_step<<endl; return 0; }