hdu 1429 二进制 位压缩 bfs
来源:互联网 发布:由诲女知之乎的意思 编辑:程序博客网 时间:2024/06/05 06:01
找大神代码学了下二进制状态压缩
用key&(1<<K(大写字母))来判断是不是握有当前门的钥匙,用key|(1<<K(小写字母))来增添新钥匙
只有十个钥匙 所以可以用状态数组第三维表示这些钥匙分别有或无的状态
用位压缩来记录不同的钥匙状态
10表示第2把钥匙的状态, 1100表示有第3把和第4把钥匙的状态,因为11101110&00100000==00100000 说明那一把钥匙在里面,若为0就不在这里面。
如果是小写字母 也就是要是 用|符号可以将二进制下的两个数相加 相当于把钥匙放在了钥匙堆里面了
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<string>#include<vector>#include<cctype>#include<queue>#include<map>#include<set>using namespace std;int dir[4][2]= {0,1,0,-1,1,0,-1,0};char g[21][21];bool mark[1025][21][21];int n,m,T;struct tp{ int x,y,t,key; tp(){}; tp(int x,int y,int t,int key):x(x),y(y),t(t),key(key){}};queue<tp>q;int bfs(int cx,int cy){ int x,y,t,key; while(!q.empty()) q.pop();// memset(mark,0,sizeof(mark));// mark[0][cx][cy]=1;//第一个无钥匙的状态 加入对列 q.push(tp(cx,cy,0,0)); while(!q.empty()) { tp cur; cur=q.front(); q.pop(); if(cur.t>=T)//要有= 只大于的话 到下面移动超T时间就错了 break; for(int i=0; i<4; i++) { x=cur.x+dir[i][0]; y=cur.y+dir[i][1]; t=cur.t+1; key=cur.key; if(g[x][y]=='*') continue; if(mark[key][x][y]||x<=0||x>n||y<=0||y>m) continue; if(isupper(g[x][y])&&!(key&(1<<(g[x][y]-'A')))) continue;不能开门的 继续循环 if(islower(g[x][y])) key=(key|(1<<(g[x][y]-'a')));//将钥匙加入钥匙串 if(g[x][y]=='^') return t; if(!mark[key][x][y]) { mark[key][x][y]=true; q.push(tp(x,y,t,key)); } } } return -1;}int main(){ int x,y; while(scanf("%d%d%d",&n,&m,&T)!=EOF) { T--; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) { scanf(" %c",&g[i][j]); if(g[i][j]=='@') g[i][j]='.',x=i,y=j; } printf("%d\n",bfs(x,y)); }}
- hdu 1429 二进制 位压缩 bfs
- hdu 1429 bfs+二进制状态压缩
- hdu 1885 BFS + 二进制压缩
- hdu 1429 胜利大逃亡(续)(BFS+位压缩)
- [HDU 3278] Puzzle BFS+位压缩
- hdu 4012(bfs+位压缩)
- (HDU 1429)胜利大逃亡(续) BFS + 二进制状态压缩
- hdu 1429 BFS+状态压缩
- HDU 1429 BFS+状态压缩
- hdu~1429(bfs+状态压缩)
- HDU 1429 BFS+状态压缩
- hdu 1429 bfs+状态压缩
- hdu 1429 bfs 状态压缩
- hdu 1429 胜利大逃亡(续)(BFS+位压缩+走回头路)
- POJ1753位压缩BFS
- poj1753 位压缩+bfs
- HDU 3220Alice’s Cube(按位压缩+BFS)
- hdu 1429 BDF+二进制状态压缩
- [35]Search Insert Position
- Java学习笔记五
- 软件评测知识点
- 插入排序(InserSort)
- rqnoj-653
- hdu 1429 二进制 位压缩 bfs
- Using R to Fix Data Quality: Section 4
- linux 用户空间和内核空间延时函数
- 2013菏泽国际牡丹文化旅游节
- Android自动化测试之使用java调用monkeyrunner
- 构造函数的重载
- Java学习笔记六
- wAF绕过测试
- Netfilter中返回值的具体用法