poj3185//BFS随便切...

//poj 3185 
2 //利用bit,通过位运算切换状态 ,然后BFS一下,轻易水过。 
3 //说完好像很简单。。。是的,简单是简单,弱第一次以这种位运算姿势过题,太劲。膜思路 ORZ...  
4 
5 #include<iostream> 
6 #include<string.h> 
7 #include<set> 
8 #include<queue> 
9 #include<sstream> 
10 using namespace std; 
11 

12 bool vis[1<<21]; 
13 int step[1<<21]; 
14 int q[100000000]; 
15 int head,tail; 
16 

17 int BFS(int x) 
18 { 
19  memset(vis,0,sizeof(vis)); 
20  vis[x]=1; 
21  head=0;tail=1; 
22  q[head]=x; 
23  step[x]=0; 
24  while(head<tail) 
25  { 
26      int u=q[head];head++; 
27      if(u==0) 
28          return step[u]; 
29      for(int i=1;i<19;i++) 
30      { 
31          int r=u; 
32          r^=(1<<i-1)|(1<<i)|(1<<i+1); 
33          if(!vis[r]) 
34          { 
35              vis[r]=1; 
36              step[r]=step[u]+1; 
37              if(r==0) return step[r]; 
38              q[tail++]=r; 
39          } 
40      } 
41      int r; 
42      r=u^(1<<0)^(1<<1); 
43      if(!vis[r]) 
44      {        
45          vis[r]=1; 
46          step[r]=step[u]+1; 
47          if(r==0) return step[r]; 
48          q[tail++]=r; 
49      } 
50      r=u^(1<<18)^(1<<19); 
51      if(!vis[r])  
52      { 
53          vis[r]=1; 
54          step[r]=step[u]+1; 
55          if(r==0) return step[r]; 
56          q[tail++]=r; 
57      } 
58  } 
59  return -1; 
60   
61 } 
62 

63 int main() 
64 { 
65  int ans=0;       
66  int x; 
67  for(int i=0;i<20;i++) 
68  { 
69      scanf("%d",&x); 
70      ans|=(x<<i); 
71  } 
72  printf("%d\n",BFS(ans)); 
73  return 0; 
74 } 
posted @ 2016-05-20 13:19  see_you_later  阅读(124)  评论(0编辑  收藏  举报