Link:http://acm.hdu.edu.cn/showproblem.php?pid=1429
4 5 17 @A.B. a*.*. *..*^ c..b* 4 5 16 @A.B. a*.*. *..*^ c..b*
16 -1
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<map> using namespace std; int r,c,t; char m[22][22]; bool vis[22][22][1025]; int d[4][2]={1,0,0,1,-1,0,0,-1}; struct node{ int x; int y; int key; int sp; }st,ed; int bfs() { queue<node>q; node cur,nex; int i; memset(vis,false,sizeof(vis)); q.push(st); vis[st.x][st.y][st.key]=true; while(!q.empty()) { cur=q.front(); q.pop(); if(cur.x==ed.x&&cur.y==ed.y)//遇到出口 { return cur.sp; } for(i=0;i<4;i++) { nex.x=d[i][0]+cur.x; nex.y=d[i][1]+cur.y; nex.key=cur.key; nex.sp=cur.sp+1; if(nex.sp<t&&nex.x>=0&&nex.y>=0&&nex.x<r&&nex.y<c&&m[nex.x][nex.y]!='*'&&!vis[nex.x][nex.y][nex.key]) { if(m[nex.x][nex.y]>='A'&&m[nex.x][nex.y]<='J')//遇到门,则判断是否拥有对应的钥匙 { if((1<<(m[nex.x][nex.y]-'A'))&nex.key&&!vis[nex.x][nex.y][nex.key])//有当前门的钥匙可以开门 { q.push(nex); vis[nex.x][nex.y][nex.key]=true;//少了这句没发现,MLE无数次 } } else if(m[nex.x][nex.y]>='a'&&m[nex.x][nex.y]<='j')//遇到钥匙,则修改一下状态 { int tmpkey=nex.key; tmpkey|=(1<<(m[nex.x][nex.y]-'a')); if(!vis[nex.x][nex.y][tmpkey]) { nex.key=tmpkey; q.push(nex); vis[nex.x][nex.y][nex.key]=true; } } else { if(!vis[nex.x][nex.y][nex.key]) { q.push(nex); vis[nex.x][nex.y][nex.key]=true; } } } } } return -1; } int main() { int ans; while(~scanf("%d%d%d",&r,&c,&t)) { for(int i=0;i<r;i++) { scanf("%s",&m[i]); for(int j=0;j<c;j++) { if(m[i][j]=='@') { st.key=0; st.sp=0; st.x=i; st.y=j; } else if(m[i][j]=='^') { ed.x=i; ed.y=j; } } } ans=bfs(); printf("%d\n",ans); } return 0; }