POJ 2965 The Pilots Brothers' refrigerator(BFS+二进制判重)

来源:互联网 发布:学生赚钱的软件 编辑:程序博客网 时间:2024/05/21 11:55

很奇怪,提交时候用C++就超时而G++则不会.

875MS过的

#include <iostream>#include <cstdio>#include <queue>#include <map>const int maxn=65538;using namespace std;struct state{int data;int cp;};bool vis[maxn];state q[maxn];int fa[maxn];void printPath(int v,int cnt){if(fa[v]==0){printf("%d\n",cnt);return;}printPath(fa[v],cnt+1);printf("%d %d\n",q[v].cp/4+1,q[v].cp%4+1);}void bfs(state s){int front=1,rear=1;q[rear++]=s;vis[s.data]=1;while (front<rear){state t=q[front];if(t.data==0){printPath(front,0);return;}for (int i=0;i<16;++i){state temp=t;for (int j=i%4;j<16;j+=4){temp.data=temp.data^(1<<j);}for (int j=i&0xFFFC,bound=j+4;j<bound;++j){if(j==i)continue;temp.data=temp.data^(1<<j);}if(!vis[temp.data]){fa[rear]=front;temp.cp=i;vis[temp.data]=1;q[rear++]=temp;}}front++;}}int main(){state start;start.data=start.cp=0;for (int i=0;i<16;++i){char v;cin>>v;if(v=='+'){start.data|=(1<<i);}}bfs(start);return 0;}