http://acm.hdu.edu.cn/showproblem.php?pid=1429
//1329152 2009-05-02 08:34:49 Accepted 1429 687MS 4252K 2405 B C++ no way #include<iostream> #include<queue> using namespace std; struct Node { int x; int y; int step; int num; bool mark[10]; }; int dir[4][2]={-1,0,1,0,0,-1,0,1}; int binary[26]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072, 262144,524288,1048576,2097152,4194304,8388608,16777216,33554432}; char gra[21][21]; int flag[21][21][2049]; int m,n,t; int sx,sy,ex,ey;
void bfs() { int i,k,temp,ch; Node p,q; queue<Node>Q; p.x = sx; p.y = sy; p.step = 0; p.num = 0; for(i=0;i<10;i++) p.mark[i] = false; Q.push(p); while(!Q.empty()) { q = Q.front(); Q.pop(); if(q.x == ex && q.y == ey) { if(q.step < t) { cout<<q.step<<endl; return ; } break ; } for(k=0;k<4;k++) { p = q; p.x += dir[k][0]; p.y += dir[k][1]; if(p.x >=0 && p.x<m && p.y>=0 && p.y<n && gra[p.x][p.y] != '*') { if(gra[p.x][p.y] >= 'a' && gra[p.x][p.y] <= 'j') { ch = gra[p.x][p.y] - 'a'; if(p.mark[ch] == false) temp = p.num + binary[ch]; else temp = p.num; if(flag[p.x][p.y][temp] == -1) { flag[p.x][p.y][temp] = q.step + 1; p.step = q.step + 1; p.num = temp; p.mark[ch] = true; Q.push(p); } } else if(gra[p.x][p.y] >= 'A' && gra[p.x][p.y] <= 'J') { ch = gra[p.x][p.y] - 'A'; if(flag[p.x][p.y][p.num] == -1 && p.mark[ch] == true) { flag[p.x][p.y][p.num] = q.step + 1; p.step = q.step + 1; Q.push(p); } } else { if(flag[p.x][p.y][p.num] == -1) { flag[p.x][p.y][p.num] = q.step + 1; p.step = q.step + 1; Q.push(p); } } } }//for(k=0;k<4;k++) }//while(!Q.empty()) cout<<-1<<endl; }
int main() { int i,j,k; while(cin>>m>>n>>t) { for(i=0;i<m;i++) { scanf("%s",gra[i]); for(j=0;j<n;j++) { if(gra[i][j] == '@') { sx = i; sy = j; } else if(gra[i][j] == '^') { ex = i; ey = j; } for(k=0;k<2049;k++) flag[i][j][k] = -1; } } bfs(); } return 0; }
|