博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zoj4020 Traffic Light(bfs+状态压缩)
阅读量:6331 次
发布时间:2019-06-22

本文共 2397 字,大约阅读时间需要 7 分钟。

题意:每个点有两种状态,0/1,0表示只能上下方向走,1表示只能左右方向走。每走一步整个图的状态改变一次(即0->1,1->0)。

数据范围:n,m<=1e15

开始迷之因为数组太大编译不过(但是有的人过了就不是很懂orz)。强制状态压缩,将map用vector存储。然后对于每个点奇数次访问用2标记,偶数次访问用4标记。

利用int是8字节的特点,最后一位记录map,前面两位记录访问状态。

若奇数次访问过后,map[i][j] |= 2;若偶数次访问过后,map[i][j] |= 4。

这种状压真的强势。

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #define maxn 100005 8 using namespace std; 9 const int change[2]={-1,1}; 10 struct point{ 11 int x,y; 12 int time; 13 }sstart; 14 int n,m; 15 int x1,x2,y11,y2; 16 vector
map[maxn]; 17 int check(point tmp){ 18 if (tmp.x<0 || tmp.x>=n || tmp.y<0 || tmp.y>=m) return 0; 19 else return 1; 20 } 21 int bfs(){ 22 queue
Q; 23 sstart.x=x1;sstart.y=y11;sstart.time=0;map[x1][y11]|=4; 24 Q.push(sstart); 25 while (!Q.empty()){ 26 point pre=Q.front(); 27 Q.pop(); 28 if (pre.x==x2 && pre.y==y2) return pre.time; 29 if (pre.time%2==0){ 30 if (!(map[pre.x][pre.y]&1)){ //上下 31 for (int i=0;i<2;i++){ 32 point next; 33 next.x=pre.x+change[i]; 34 next.y=pre.y; 35 next.time=pre.time+1; 36 if (check(next) && !((int)map[next.x][next.y]&4)){ 37 Q.push(next); 38 map[next.x][next.y]|=4; 39 } 40 } 41 } 42 if (map[pre.x][pre.y]&1){ //左右 43 for (int i=0;i<2;i++){ 44 point next; 45 next.x=pre.x; 46 next.y=pre.y+change[i]; 47 next.time=pre.time+1; 48 if (check(next) && !((int)map[next.x][next.y]&4)){ 49 Q.push(next); 50 map[next.x][next.y]|=4; 51 } 52 } 53 } 54 } 55 else{ 56 if (!(map[pre.x][pre.y]&1)){ //左右 57 for (int i=0;i<2;i++){ 58 point next; 59 next.x=pre.x; 60 next.y=pre.y+change[i]; 61 next.time=pre.time+1; 62 if (check(next) && !((int)map[next.x][next.y]&2)){ 63 Q.push(next); 64 map[next.x][next.y]|=2; 65 } 66 } 67 } 68 if (map[pre.x][pre.y]&1){ //上下 69 for (int i=0;i<2;i++){ 70 point next; 71 next.x=pre.x+change[i]; 72 next.y=pre.y; 73 next.time=pre.time+1; 74 if (check(next) && !((int)map[next.x][next.y]&2)){ 75 Q.push(next); 76 map[next.x][next.y]|=2; 77 } 78 } 79 } 80 } 81 } 82 return -1; 83 } 84 int main(){ 85 int t; 86 char xx; 87 cin >> t; 88 while (t--){ 89 cin >> n >> m; 90 for (int i=0;i
> xx; 94 map[i].push_back(xx); 95 } 96 getchar(); 97 } 98 cin >> x1 >> y11 >> x2 >> y2; 99 x1--;y11--;x2--;y2--;100 int ans;101 ans=bfs();102 cout << ans << endl;103 }104 return 0;105 }

转载于:https://www.cnblogs.com/changer-qyz/p/8757212.html

你可能感兴趣的文章
在非纯色背景上,叠加背景透明的BUTTON和STATIC_TEXT控件
查看>>
Distributed2:Linked Server Login 添加和删除
查看>>
海量数据处理相关面试问题
查看>>
Python-time
查看>>
Java中取两位小数
查看>>
RTX发送消息提醒实现以及注意事项
查看>>
使用 ftrace 调试 Linux 内核【转】
查看>>
唯一聚集索引上的唯一和非唯一非聚集索引
查看>>
Spark新愿景:让深度学习变得更加易于使用——见https://github.com/yahoo/TensorFlowOnSpark...
查看>>
linux磁盘配额
查看>>
NFS文件共享服务器的搭建
查看>>
%r 和 %s 该用哪个?
查看>>
小公司职场不是“切糕”
查看>>
play工程部署到云服务器
查看>>
ListView 取消点击效果
查看>>
降级论
查看>>
wampServer连接oracle
查看>>
CentOS 6.5下编译安装新版LNMP
查看>>
Android Picasso
查看>>
top命令
查看>>