首页 > 代码库 > HDU5094【BFS+状态压缩】
HDU5094【BFS+状态压缩】
#include<iostream>#include<cstdio>#include<queue>using namespace std;const int NO=56;const int INF=1000000000;struct X{ int x,y; int key;}dir[]={{-1,0}/*¡ü*/,{0,1}/*¡ú*/,{1,0}/*¡ý*/,{0,-1}/*¡û*/},a,b;int n,m,q;int MAP[NO][NO][NO][NO];int key[NO][NO];int step[NO][NO][1024];void reset_step(){ for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=0;k<1<<q;k++) step[i][j][k]=INF;}int bfs(){ reset_step(); queue<X> t; a.x=a.y=1; a.key=0; step[a.x][a.y][a.key]=0; t.push(a); while(!t.empty()) { a=t.front(); t.pop(); if(a.x==n&&a.y==m) return step[a.x][a.y][a.key]; for(int i=0;i<4;i++) { b.x=a.x+dir[i].x; b.y=a.y+dir[i].y; if((MAP[a.x][a.y][b.x][b.y]&a.key)==MAP[a.x][a.y][b.x][b.y]) { b.key=a.key|key[b.x][b.y]; if(step[b.x][b.y][b.key]==INF) { step[b.x][b.y][b.key]=step[a.x][a.y][a.key]+1; t.push(b); } } } } return -1;}int main(){ while(scanf("%d%d%d",&n,&m,&q)==3) { for(int i=1;i<=n;i++) { MAP[i][0][i][1]=MAP[i][1][i][0]=1<<q; MAP[i][m][i][m+1]=MAP[i][m+1][i][m]=1<<q; } for(int j=1;j<=m;j++) { MAP[0][j][1][j]=MAP[1][j][0][j]=1<<q; MAP[n][j][n+1][j]=MAP[n+1][j][n][j]=1<<q; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { key[i][j]=0; for(int x=1;x<=n;x++) for(int y=1;y<=m;y++) MAP[i][j][x][y]=MAP[x][y][i][j]=0; } int k; scanf("%d",&k); int a,b,c,d,e; while(k--) { scanf("%d%d%d%d%d",&a,&b,&c,&d,&e); if(e==0) e=1<<q; else e=1<<(e-1); MAP[a][b][c][d]=MAP[c][d][a][b]=e; } scanf("%d",&k); while(k--) { scanf("%d%d%d",&a,&b,&c); key[a][b]|=1<<(c-1); } printf("%d\n",bfs()); } return 0;}
HDU5094【BFS+状态压缩】
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。