http://acm.hdu.edu.cn/showproblem.php?pid=1429
经典的找钥匙开门走迷宫问题,把钥匙状态压缩一下,然后对迷宫bfs
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> using namespace std; int n,m,t; int vis[25][25][1<<10]; struct node{ int x,y,s,step; }; char M[25][25]; int dx[]={1,-1,0,0}; int dy[]={0,0,1,-1}; int gao(int x,int k){ return (x>>k)&1; } int bfs(node s){ queue <node> q; q.push(s); memset(vis,0,sizeof(vis)); vis[s.x][s.y][0]=1; while(!q.empty()){ node u=q.front(); q.pop(); if(M[u.x][u.y]=='^'){ return u.step; } for(int i=0;i<4;i++){ int xx=u.x+dx[i]; int yy=u.y+dy[i]; if(xx<0 || xx>=n || yy<0 || yy>=m)continue; if(M[xx][yy]=='*')continue; if(M[xx][yy]>='A' && M[xx][yy]<='J' && !(gao(u.s,M[xx][yy]-'A')))continue; node next=u; if(M[xx][yy]>='a' && M[xx][yy]<='j'){ if(!gao(u.s,M[xx][yy]-'a')){ next.x=xx;next.y=yy;next.step++;next.s|=(1<<(M[xx][yy]-'a')); if(next.step<t && !vis[xx][yy][next.s]){ vis[xx][yy][next.s]=1; q.push(next); } } else{ next.x=xx;next.y=yy;next.step++; if(!vis[xx][yy][u.s] && next.step<t){ vis[xx][yy][next.s]=1; q.push(next); } } } else{ next.x=xx;next.y=yy;next.step++; if(next.step<t && !vis[xx][yy][next.s]){ vis[xx][yy][next.s]=1; q.push(next); } } } } return -1; } int main(){ while(~scanf("%d%d%d",&n,&m,&t)){ for(int i=0;i<n;i++) scanf("%s",M[i]); node s; for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(M[i][j]=='@') s.x=i,s.y=j; s.s=0;s.step=0; printf("%d\n",bfs(s)); } return 0; }