首页 > 代码库 > BFS+二进制状态压缩 hdu-1429
BFS+二进制状态压缩 hdu-1429
好久没写搜索题了,就当练手吧。
vis[][][1025]第三个维度用来维护不同key持有状态的访问情况。
对于只有钥匙没有对应门的位置,置为‘.‘,避免不必要的状态分支。
//// main.cpp// hdu_1429//// Created by Luke on 16/10/8.// Copyright © 2016年 Luke. All rights reserved.//#include <iostream>#include <string>#include <cstring>#include <queue>using namespace std;int n,m,t;int ex,ey;char Map[25][25];int bit[10];struct Node{ int y,x; int key; int step;};bool vis[25][25][1025];int dir[4][2]={1,0,-1,0,0,1,0,-1};bool ok(Node &te){ if(te.step>=t) return false; if(te.y<0||te.y>=n||te.x<0||te.x>=m) return false; if(vis[te.y][te.x][te.key]) return false; if(Map[te.y][te.x]==‘*‘) return false; if(Map[te.y][te.x]>=‘A‘&&Map[te.y][te.x]<=‘J‘) { int fix=bit[Map[te.y][te.x]-‘A‘]; if(!(fix&te.key)) return false; } if(Map[te.y][te.x]>=‘a‘&&Map[te.y][te.x]<=‘j‘) te.key|=bit[Map[te.y][te.x]-‘a‘]; vis[te.y][te.x][te.key]=1; return true;}int bfs(int sy,int sx){ queue<Node> q; q.push((Node){sy,sx,0,0}); memset(vis,0,sizeof(vis)); Node now,nx; while(!q.empty()) { now=q.front(),q.pop(); if(now.y==ey&&now.x==ex) return now.step; for(int i=0;i<4;i++) { nx=now; nx.y+=dir[i][0],nx.x+=dir[i][1]; nx.step++; if(ok(nx)) q.push(nx); } } return -1;}int main(int argc, const char * argv[]) { cin.sync_with_stdio(false); bit[0]=1; for(int i=1;i<10;i++) bit[i]=bit[i-1]<<1; while(cin>>n>>m>>t) { int sx,sy; bool fix[10]; memset(fix,0,sizeof(fix)); for(int i=0;i<n;i++) for(int j=0;j<m;j++) { cin>>Map[i][j]; if(Map[i][j]>=‘A‘&&Map[i][j]<=‘J‘) fix[Map[i][j]-‘A‘]=1; if(Map[i][j]==‘^‘) ex=j,ey=i; if(Map[i][j]==‘@‘) sx=j,sy=i; } for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(Map[i][j]>=‘a‘&&Map[i][j]<=‘j‘) if(!fix[Map[i][j]-‘a‘]) Map[i][j]=‘.‘; cout<<bfs(sy,sx)<<endl; } return 0;}
BFS+二进制状态压缩 hdu-1429
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。