poj 1753

来源:互联网 发布:cda数据分析培训 编辑:程序博客网 时间:2024/05/30 23:03
#include <iostream>#include <queue>using namespace std;const int ALLBLACK=65535;const int ALLWHITE=0;const int MAX=65536;int convert(char c){if('b'==c)return 1;if('w'==c)return 0;}/**   为了提高搜索效率,采用位运算,   如果想将整数的二进制某一位翻转可采用   id^=(1<<x)(x代表要翻转的位置)  */int flipgame(int statenum,int pos){//转换statenum^=(1<<pos);//当前位翻转if(pos/4>0)//upstatenum^=(1<<(pos-4));if(pos/4<3)//downstatenum^=(1<<(pos+4));if(pos%4>0)//leftstatenum^=(1<<(pos-1));if(pos%4<3)statenum^=(1<<(pos+1));return statenum;}int main(){char c;int i,statenum=0;for(i=0;i<16;i++){//初始化状态cin>>c;statenum+=(convert(c)<<i);}if(ALLBLACK==statenum||ALLWHITE==statenum){cout<<0<<endl;return 0;}int state[65536];//记录从初始态达到某个状态所需的步数memset(state,-1,sizeof(state));queue<int> q;int nextnum;       state[statenum]=0;q.push(statenum);//求解释while(!q.empty()){statenum=q.front();q.pop();for(i=0;i<16;i++){nextnum=flipgame(statenum,i);if(ALLBLACK==nextnum||ALLWHITE==nextnum){cout<<state[statenum]+1<<endl;return 0;}if(state[nextnum]==-1){state[nextnum]=state[statenum]+1;q.push(nextnum);}}}cout<<"Impossible"<<endl;return 0;}

原创粉丝点击