POJ 1753

题意:将一个棋子和它四个方向上的棋子全部反色。问最少用多少次将起始状态变成终止状态

 

总结:BFS。不过中间使用的位运算还是值得多研究的。从别处学来的技巧

 

统计:78ms, 348k, 1Y

 

#include <iostream> #include <queue> using namespace std; typedef struct State { int step; int state; }; State s,temp,t; char map[4][4]; bool hash[70000]; void Move(int r) { t.state^=(1<<(15-r)); if(r>=4) t.state^=(1<<(15-r+4)); if(r<=11) t.state^=(1<<(15-r-4)); if((r%4)) t.state^=(1<<(15-r+1)); if(((r+1)%4)) t.state^=(1<<(15-r-1)); } void Bfs() { queue<State> q; bool flag=false; hash[s.state]=true; q.push(s); while(!q.empty()) { temp=q.front(); q.pop(); for(int i=0;i<16;i++) { t=temp; Move(i); if(t.state==0||t.state==65535) { flag=true; cout<<t.step+1<<endl; break; } if(!hash[t.state]) { hash[t.state]=true; t.step=temp.step+1; q.push(t); } } if(flag) break; } if(!flag) cout<<"Impossible"<<endl; } int main() { //freopen ("in.txt","r",stdin); s.state=0; for(int i=0;i<4;i++) for(int j=0;j<4;j++) { cin>>map[i][j]; if(map[i][j]=='b') s.state+=1; s.state<<=1; } s.state>>=1; memset(hash,false,sizeof(hash)); s.step=0; if(s.state==0||s.state==65535) cout<<"0"<<endl; else Bfs(); return 0; }

你可能感兴趣的:(struct)