poj3185//BFS随便切...

本文介绍了一种使用位运算结合BFS算法解决POJ3185问题的方法。通过位运算来表示和切换状态,再利用BFS搜索最短路径,实现了一个简洁高效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//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 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值