hdu 1429胜利大逃亡(续) - 好孩子's Blog

hdu 1429胜利大逃亡(续)

好孩子 posted @ 2011年9月29日 12:16 in 搜索 , 1020 阅读

 

//hash判重
//好孩子;
//hdu1429利用二进制的&和|运算:

#include<iostream>
#include<queue>

using namespace std;
const int T = 22;
char g[T][T];
int vis[T][T][1030],n,m,t,ans;
int dir[4][2]={0,1,1,0,0,-1,-1,0};

struct point{
    int x;
    int y;
    int step;
    int key;
};

point s;

void inset(){
    for(int i=0;i<n;i++){
        cin>>g[i];
        for(int j=0;j<m;j++){
            if(g[i][j]=='@'){
                s.x=i;
                s.y=j;
                s.key=0;
                s.step=0;
            }
        }
    }
}



void bfs(){
    queue<point>  Q;
    point tp;
    ans=-1;
    memset(vis,0,sizeof(vis));
    vis[s.x][s.y][s.key]=1;
    Q.push(s);
    while(!Q.empty()){
         tp=Q.front();Q.pop();
         for(int k=0;k<4;k++){
             s=tp;
             s.x=tp.x+dir[k][0];
             s.y=tp.y+dir[k][1];
             if(s.x>=0 && s.x<n && s.y>=0 && s.y<m && g[s.x][s.y]!='*' && !vis[s.x][s.y][s.key]){
                 if(g[s.x][s.y]=='.' || g[s.x][s.y]=='@'){
                       vis[s.x][s.y][s.key]=1;
                       s.step+=1;
                       Q.push(s);
                       //cout<<s.x<<" "<<s.y<<endl;
                 }
                 if(g[s.x][s.y]=='^'){
                     if(s.step+1<t) ans=s.step+1;
                     return ;
                 }

                 if(g[s.x][s.y]>='A' && g[s.x][s.y]<='J'){
                      int key=1<<(g[s.x][s.y]-'A');
                      if(s.key & key){
                           vis[s.x][s.y][s.key]=1;
                           s.step+=1;
                           Q.push(s);
                          //cout<<s.x<<" "<<s.y<<endl;
                      }
                 }

                 if(g[s.x][s.y]>='a' && g[s.x][s.y]<='j'){
                       int key=1<<(g[s.x][s.y]-'a');
                       if(!vis[s.x][s.y][s.key|key]){
                            vis[s.x][s.y][s.key|key]=1;
                            s.step+=1;s.key=s.key|key;
                            Q.push(s);
                            //cout<<s.x<<" "<<s.y<<endl;
                       }
                 }
             }
         }
    }
}



int main(){

    while(cin>>n>>m>>t){
        inset();
        bfs();
        cout<<ans<<endl;
    }


    return 0;
}

 

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter