Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1065 Accepted Submission(s): 379
4 5 17 @A.B. a*.*. *..*^ c..b* 4 5 16 @A.B. a*.*. *..*^ c..b*
16 -1#include <iostream> #include <queue> using namespace std; #define N 25 struct node { int x,y,time,cnt;//cnt标记当前找到钥匙的状态 bool flag[10];//标记当前路径的钥匙 }; char map[N][N];//地图 int mark[N][N][1100];//记录路径的状态,标记当前路径钥匙的状态 int key[10]={1, 2, 4, 8, 16, 32, 64, 128, 256, 512}; int time; int x1,y1,x2,y2; int dis[4][2] = {{0,1},{1,0},{-1,0},{0,-1}}; void BFS() { int i,k,temp; queue<node> q; node s1,s2; s1.x = x1; s1.y = y1; s1.time = time; s1.cnt = 0; memset(s1.flag,0,sizeof(s1.flag)); q.push(s1); memset(mark,0,sizeof(mark)); while (!q.empty()) { s1 = q.front(); q.pop(); if(s1.x == x2 && s1.y == y2) { if(s1.time > 0) { printf("%d/n",time - s1.time); return; } break; } for(i=0;i<4;i++) { s2=s1; s2.x += dis[i][0]; s2.y += dis[i][1]; s2.time --; if(map[s2.x][s2.y]!='*') { if(map[s2.x][s2.y]>='a' && map[s2.x][s2.y]<='j') { k = map[s2.x][s2.y] - 'a'; if(s2.flag[k]) temp = s2.cnt; else temp = s2.cnt + key[k]; if(!mark[s2.x][s2.y][temp]) { mark[s2.x][s2.y][temp] = 1; s2.cnt = temp; s2.flag[k] = 1; q.push(s2); } } else if(map[s2.x][s2.y]>='A' && map[s2.x][s2.y]<='J') { k = map[s2.x][s2.y] - 'A'; if(s2.flag[k] && !mark[s2.x][s2.y][s2.cnt]) { mark[s2.x][s2.y][s2.cnt] = 1; q.push(s2); } } else if(map[s2.x][s2.y] == '.') { if(!mark[s2.x][s2.y][s2.cnt]) //当前钥匙的路径状态 { mark[s2.x][s2.y][s2.cnt] = 1; q.push(s2); } } } } } printf("-1/n"); } int main() { int n,m,i,j; while (scanf("%d%d%d",&n,&m,&time)!=EOF) { memset(map,'*',sizeof(map)); getchar(); for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { scanf("%c",&map[i][j]); if(map[i][j]=='@') { x1=i;y1=j; map[i][j]='.'; } else if(map[i][j]=='^') { x2=i;y2=j; map[i][j]='.'; } } getchar(); } BFS(); } return 0; }