棋盘的上的每一个状态对应一个二进制串,以初始状态为跟节点建树,然后广度优先遍历这颗树,层数为所求的值。
#include<iostream>
#include<queue>
#define ALL_WHITE 0
#define ALL_BLACK 65535
using namespace std;
int states[65536];
int state,temp;
int flip(int state_current, int pos) {
state_current ^= (1 << pos);
if (pos - 4 >= 0) {
state_current ^= (1 << (pos - 4));
}
if (pos + 4 < 16) {
state_current ^= (1 << (pos + 4));
}
if (pos % 4 != 0) {
state_current ^= (1 << (pos - 1));
}
if (pos % 4 != 3) {
state_current ^= (1 << (pos + 1));
}
return state_current;
}
void bfs() {
int i;
memset(states,-1,sizeof(states));
queue<int> q;
states[state] = 0;
q.push(state);
if (state == ALL_BLACK || state == ALL_WHITE){
cout<<"0"<<endl;
return ;
}
while(!q.empty()){
temp=q.front();
q.pop();
for(i=0;i<16;i++) {
int next_state = flip(temp, i);
if (next_state == ALL_BLACK || next_state == ALL_WHITE){
cout<<states[temp]+1<<endl;
return ;
}
if (states[next_state] == -1){
states[next_state] = states[temp] + 1;
q.push(next_state);
}
}
}
cout<<"Impossible"<<endl;
}
int main(){
char c;
int i;
state = 0;
for(i=0; i<16; i++){
cin>>c;
if(c=='b'){
state += 1<<i;
}
if (c == 'w'){
state += 0<<i;
}
}
bfs();
return 0;
}