HDU1429 胜利大逃亡(续)

http://acm.hdu.edu.cn/showproblem.php?pid=1429

学习位压缩很好的一道题,因为只有10把钥匙,那么可以把10钥匙压缩二进制,比如1000就表示身上只要第4把钥匙的状态,110表示带有第2把和第3把钥匙,那么要判断当前的钥匙串有没有能打开当前门钥匙,那么就只要一个&运算就可以,因为11101110&00100000==00100000 这样就说明那一把钥匙在里面,若为0就不在这里面。如果对于当前点是一把钥匙的时候,只要|运算就可以了,11101110 | 00010000 z这样就把当前这把钥匙放进了钥匙串里面了

那么久枚举状态,每个点持有多把钥匙的最小步数。。hash一下就可以了。。

#include #include using namespace std ; char map[21][21] ; bool hash[21][21][1025] ; int dx[] = {0,-1,0,1} ; int dy[] = {-1,0,1,0} ; int n,m,t; struct state { int x,y,key,st; bool logic() { if(x>=0&&x=0&&yq ; int bfs() { while(!q.empty()) { cur = q.front() ; q.pop() ; if(map[cur.x][cur.y]=='^') { if(cur.st=t) break; for(int i=0;i<4;i++) { next = cur ; next.x += dx[i] ; next.y += dy[i] ; next.st ++ ; if(next.logic()) { if(map[next.x][next.y]>='A'&&map[next.x][next.y]<='J') { int key = (map[next.x][next.y] - 'A') ; // (next.key&key) ?= key if(((next.key>>key)&1)&&!hash[next.x][next.y][next.key]) { hash[next.x][next.y][next.key] = true ; q.push(next) ; } } else if(map[next.x][next.y]>='a'&&map[next.x][next.y]<='j') { int key =(1<<(map[next.x][next.y] - 'a')) ; next.key = (next.key|key) ; if(!hash[next.x][next.y][next.key]) { hash[next.x][next.y][next.key] = true ; q.push(next); } } else { if(!hash[next.x][next.y][next.key]) { hash[next.x][next.y][next.key] = true ; q.push(next); } } } } } return -1 ; } int main() { while(scanf("%d%d%d",&n,&m,&t)!=EOF) { memset(hash,false,sizeof(hash)); for(int i=0;i

你可能感兴趣的:(搜索与枚举,ini)