hdu 1429胜利大逃亡(续)

来源:互联网 发布:个性化排序算法 编辑:程序博客网 时间:2024/03/29 23:24

状态压缩+宽搜



#include<cstdio>#include<iostream>#include<cstring>#include<queue>using namespace std;int n,m,t;int sx,sy;int vis[25][25][1<<12];char map[25][25];int dir[4][2]={1,0,-1,0,0,1,0,-1};struct state{int x,y,key,nowTime;state(){}state(int xx,int yy,int kk,int nn):x(xx),y(yy),key(kk),nowTime(nn){}void get(int xx,int yy,int kk,int nn){x=xx,y=yy,key=kk,nowTime=nn;} bool judge()    {if(x>=0&&x<n&&y>=0&&y<m&&map[x][y]!='*') return 1;return 0;         } }start;int bfs(){queue<state> q;q.push(start);while(!q.empty()){state u=q.front();q.pop();if(map[u.x][u.y]=='^'&&u.nowTime<t) return u.nowTime; if(u.nowTime>=t) break;for(int i=0;i<4;i++){     state v=u;       v.x+=dir[i][0] ;     v.y+=dir[i][1] ;     v.nowTime++ ;     if(v.judge())     {if(map[v.x][v.y]>='A'&&map[v.x][v.y]<='J'){int key=(map[v.x][v.y]-'A');if((v.key&(1<<key))&&!vis[v.x][v.y][v.key])       {         vis[v.x][v.y][v.key]=1;         q.push(v) ;   } }          else if(map[v.x][v.y]>='a'&&map[v.x][v.y]<='j')            {                int key =(1<<(map[v.x][v.y] - 'a')) ;                v.key = (v.key|key) ;                  if(!vis[v.x][v.y][v.key])                {                    vis[v.x][v.y][v.key]=1;                    q.push(v);                }          }          else           {                if(!vis[v.x][v.y][v.key])                {                    vis[v.x][v.y][v.key]=1;                     q.push(v);                }          }     }   }}return -1;}int main(){while(cin>>n>>m>>t){memset(vis,0,sizeof(vis));for(int i=0;i<n;i++){cin>>map[i];for(int j=0;j<m;j++)if(map[i][j]=='@'){start.get(i,j,0,0);vis[i][j][0]=1;}}cout<<bfs()<<endl;}return 0;}